我有一个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);
}
}
答案 0 :(得分:1)
我猜这与编译的速度有关。有很多线程似乎表明J64的编译比x64慢得多。
在这种情况下,有人看到他们的x64 JIT性能显着提高,仅仅是因为其他依赖程序集不是NGEN。虽然我怀疑它会在这种情况下有所帮助,但你永远不知道它试图加载的其他东西可能会减慢它的速度。也许尝试在答案中运行命令,看看是否会改变您的表现。 WPF slow to start on x64 in .NET Framework 4.0