为什么DynamicMethod在x64上这么慢?

时间:2012-03-13 20:34:28

标签: c# performance linq reflection.emit

我有一个WCF服务,它的数据层使用LINQ to SQL。只有存储过程正在使用中,没有动态表访问权限。当我定位x64时,我获得了x86构建的一半吞吐量。我追溯了Reflection.Emit.DynamicMethod.CreateDelegate的热门路径。我创建了一个简单的测试项目来演示两个平台之间的性能差异。

在x64上,DynamicMethod的具体解释是什么?我的模糊理解是,在x64上DynamicInvoke可能会涉及到另一个问题。


以下是在Windows 7 Enterprise x64,Core i7 Q720 @ 1.60 GHz,单线程上执行的结果:

Build Target      Average milliseconds to execute 100,000 iterations
x86               5504
x64               14699
Any CPU           14789

测试代码:

class Program
{
    private delegate string XInvoker(string arg);

    private const int OUTER_ITERATIONS = 4;
    private const int INNER_ITERATIONS = 100000;

    static void Main(string[] args)
    {
        Console.WriteLine("Timing {0} iterations, repeat {1} times...", INNER_ITERATIONS, OUTER_ITERATIONS);

        var watch = new Stopwatch();
        long totalMs = 0;

        for (int outer = 0; outer < OUTER_ITERATIONS; outer++)
        {
            watch.Restart();

            for (int inner = 0; inner < INNER_ITERATIONS; inner++)
            {
                var method = new DynamicMethod("X", typeof(string), new[] { typeof(string) });

                var ilGen = method.GetILGenerator();
                ilGen.Emit(OpCodes.Ldarg_0);
                ilGen.Emit(OpCodes.Ret);

                var del = method.CreateDelegate(typeof(XInvoker));
                var blah = del.DynamicInvoke("blah");
            }

            watch.Stop();
            totalMs += watch.ElapsedMilliseconds;

            Console.WriteLine("Took {0} ms to iterate {1} times", watch.ElapsedMilliseconds, INNER_ITERATIONS);
        }

        Console.WriteLine();
        Console.WriteLine("Overall average: {0} ms to iterate {1} times", totalMs / OUTER_ITERATIONS, INNER_ITERATIONS);
    }
}

1 个答案:

答案 0 :(得分:1)

我猜这与编译的速度有关。有很多线程似乎表明J64的编译比x64慢得多。

在这种情况下,有人看到他们的x64 JIT性能显着提高,仅仅是因为其他依赖程序集不是NGEN。虽然我怀疑它会在这种情况下有所帮助,但你永远不知道它试图加载的其他东西可能会减慢它的速度。也许尝试在答案中运行命令,看看是否会改变您的表现。 WPF slow to start on x64 in .NET Framework 4.0