private static void CompileFallbackExpressions() { var m_sub = Arithmetic.GetOperator <T, T>(Arithmetic.Operators.Subtract); var m_add = Arithmetic.GetOperator <T, T>(Arithmetic.Operators.Add); var m_mul_float = Arithmetic.GetOperator <T, float>(Arithmetic.Operators.Multiply); _Linear = (a, b, x) => { return(m_add(a, m_mul_float(m_sub(b, a), x))); }; _Cosine = (a, b, x) => { var temp = (1.0f - (float)Math.Cos(x * Math.PI)) * 0.5f; return(m_add(a, m_mul_float(m_sub(b, a), temp))); }; _CubicP = (a, b, c, d) => { return(m_sub(m_sub(d, c), m_sub(a, b))); }; _CubicR = (a, b, c, d, p, x, x2, x3) => { return(m_add( m_add( m_mul_float(p, x3), m_mul_float( m_sub( m_sub(a, b), p ), x2 ) ), m_add( m_mul_float( m_sub(c, a), x ), b ) )); }; _Hermite = (a, u, d, v, t, t2, tSquared, s, s2, sSquared) => { return(m_sub( m_add( m_add( m_mul_float(a, sSquared * (1 + t2)), m_mul_float(d, tSquared * (1 + s2)) ), m_mul_float(u, sSquared * t) ), m_mul_float(v, s * tSquared) )); }; }
public void PerformanceTest() { int numIterations = 20000; float[] r = new float[numIterations]; float numIterationsF = numIterations; float a = 0.0f, b = 1.0f, c; var _add = Arithmetic.GetOperator <float, float>(Arithmetic.Operators.Add); var _mul = Arithmetic.GetOperator <float, float>(Arithmetic.Operators.Multiply); var _sub = Arithmetic.GetOperator <float, float>(Arithmetic.Operators.Subtract); _add(0.0f, 0.0f); _mul(0.0f, 0.0f); _sub(0.0f, 0.0f); Expression <Func <float, float, float, float> > expr = (A, B, C) => A + ((B - A) * C); Func <float, float, float, float> nativeExpr = expr.Compile(); Func <float, float, float, float> genericExpr; Arithmetic.CompileExpression( (A, B, C) => A + ((B - A) * C), out genericExpr ); long start = Time.Ticks; for (int i = 0; i < numIterations; i++) { c = (i / numIterationsF); r[i] = a + ((b - a) * c); } long end = Time.Ticks; Console.WriteLine("Native expression execution time: {0} ticks for {1} iterations ({2:0.000} ticks/iter)", end - start, numIterations, (end - start) / numIterationsF); start = Time.Ticks; for (int i = 0; i < numIterations; i++) { c = (i / numIterationsF); r[i] = Arithmetic.InvokeOperator(Arithmetic.Operators.Add, a, Arithmetic.InvokeOperator(Arithmetic.Operators.Multiply, Arithmetic.InvokeOperator(Arithmetic.Operators.Subtract, b, a), c)); } end = Time.Ticks; Console.WriteLine("Naive delegate generic execution time: {0} ticks for {1} iterations ({2:0.000} ticks/iter)", end - start, numIterations, (end - start) / numIterationsF); start = Time.Ticks; for (int i = 0; i < numIterations; i++) { c = (i / numIterationsF); r[i] = _add(a, _mul(_sub(b, a), c)); } end = Time.Ticks; Console.WriteLine("Cached delegate execution time: {0} ticks for {1} iterations ({2:0.000} ticks/iter)", end - start, numIterations, (end - start) / numIterationsF); start = Time.Ticks; for (int i = 0; i < numIterations; i++) { c = (i / numIterationsF); r[i] = nativeExpr(a, b, c); } end = Time.Ticks; Console.WriteLine("Native expression delegate execution time: {0} ticks for {1} iterations ({2:0.000} ticks/iter)", end - start, numIterations, (end - start) / numIterationsF); start = Time.Ticks; for (int i = 0; i < numIterations; i++) { c = (i / numIterationsF); r[i] = genericExpr(a, b, c); } end = Time.Ticks; Console.WriteLine("Generic expression delegate execution time: {0} ticks for {1} iterations ({2:0.000} ticks/iter)", end - start, numIterations, (end - start) / numIterationsF); }
static Operators() { Add = Arithmetic.GetOperator <T, T>(Arithmetic.Operators.Add); Sub = Arithmetic.GetOperator <T, T>(Arithmetic.Operators.Subtract); Mul = Arithmetic.GetOperator <T, float>(Arithmetic.Operators.Multiply); }
static HermiteSpline() { _Sub = Arithmetic.GetOperator <T, T>(Arithmetic.Operators.Subtract); _Mul = Arithmetic.GetOperator <T, float>(Arithmetic.Operators.Multiply); }