gpt4 book ai didi

c# - 为什么 DynamicMethod 在 x64 上这么慢?

转载 作者:太空宇宙 更新时间:2023-11-03 14:04:43 25 4
gpt4 key购买 nike

我有一个使用 LINQ to SQL 作为其数据层的 WCF 服务。只使用存储过程,没有动态表访问。当我以 x64 为目标时,我得到的吞吐量是 x86 构建的一半。我已经追踪到 Reflection.Emit.DynamicMethod.CreateDelegate 的热路径。我创建了一个简单的测试项目来演示两个平台之间的性能差异。

DynamicMethod 在 x64 上如此慢的具体解释是什么?我模糊的理解是,x64 上的 DynamicInvoke 可能涉及额外的 thunk。


以下是在 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);
}
}

最佳答案

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

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

关于c# - 为什么 DynamicMethod 在 x64 上这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9691675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com