Exemplo n.º 1
0
        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);
        }
Exemplo n.º 3
0
 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);
 }
Exemplo n.º 4
0
 static HermiteSpline()
 {
     _Sub = Arithmetic.GetOperator <T, T>(Arithmetic.Operators.Subtract);
     _Mul = Arithmetic.GetOperator <T, float>(Arithmetic.Operators.Multiply);
 }