public void CodeGeneration_PerformanceTest() {
            var sw = new Stopwatch();
            sw.Start();
            var func = CodeGeneration.GetVectorMultiplyFunction<int>();
            sw.Stop();

            Console.WriteLine("Generating & Compiling method time : {0} ms ({1} ticks)", sw.ElapsedMilliseconds, sw.ElapsedTicks);

            const int TrialCount = 10000;
            var first = Enumerable.Range(0, 100).ToArray();
            var second = Enumerable.Range(0, 100).ToArray();

            // Cold start for JIT-compiling 
            func(first, second);
            CodeGeneration.MultuplyVectors(first, second);

            sw.Reset();
            sw.Start();
            for (int i = 0; i < TrialCount; i++)
                func(first, second);
            sw.Stop();
            Console.WriteLine("Generated code : {0} ms ({1} ticks)", sw.ElapsedMilliseconds, sw.ElapsedTicks);


            sw.Reset();
            sw.Start();
            for (int i = 0; i < TrialCount; i++)
                CodeGeneration.MultuplyVectors(first, second);
            sw.Stop();
            Console.WriteLine("Static code   : {0} ms ({1} ticks)", sw.ElapsedMilliseconds, sw.ElapsedTicks);
        }
        public void GetVectorMultiplyFunction_Returns_Function_For_Long() {
            var first = new long[] { 1L, 2L, 3L };
            var second = new long[] { 2L, 2L, 2L };
            var expected = 1L * 2L + 2L * 2L + 3L * 2L;

            var func = CodeGeneration.GetVectorMultiplyFunction<long>();
            var actual = func(first, second);
            Assert.AreEqual(expected, actual);
        }
        public void GetVectorMultiplyFunction_Returns_Function_For_Double() {
            var first = new double[] { 1D, 2D, 3D };
            var second = new double[] { 2D, 2D, 2D };
            var expected = 1D * 2D + 2D * 2D + 3D * 2D;

            var func = CodeGeneration.GetVectorMultiplyFunction<double>();
            var actual = func(first, second);
            Assert.AreEqual(expected, actual);
        }
        public void GetVectorMultiplyFunction_Returns_Function_For_Int() {
            var first = new int[] { 1, 2, 3 };
            var second = new int[] { 2, 2, 2 };
            var expected = 1*2 + 2*2 + 3*2;

            var func = CodeGeneration.GetVectorMultiplyFunction<int>();
            var actual = func(first, second);

            Assert.AreEqual(expected, actual);
        }