【发布时间】:2011-05-14 11:18:52
【问题描述】:
我正在试验编译器的性能。我有一小段代码,只有几个浮点乘法和加法。代码在循环中执行数百万次。我正在尝试用 C++、c#、java、perl、python 编译代码……然后在测量执行时间的同时运行结果。
我对 c# 的性能很不满意。我的 c# 代码比等效的 C++ 或 java 慢大约 60%。我敢肯定,我的实验中一定有一个错误。我想反汇编生成的二进制文件以了解原因。
MSIL 代码有这样的选项吗?可以在机器指令级别(x86 指令,而不是 MSIL 指令)检查 c# JIT 编译器的结果吗?
更新
代码(u、v、g* 为双精度;步数为整数)
stopwatch.Start();
for (int i = 0; i < steps; i++)
{
double uu = g11 * u + g12 * v;
v = g21 * u + g22 * v;
u = uu;
}
stopwatch.Stop();
【问题讨论】:
-
您确定您的基准测试允许 JIT 首先启动吗?也许你应该展示它。
-
@delnan:你是什么意思?如果 JIT 未编译,则代码无法运行。
-
@Guffa:问题是 JIT 时间是否应该包含在基准测试中。
-
向我们展示代码并描述您如何运行它的场景。指定测量时间的方式和地点。请注意,您的代码及其任何 calees 在第一次被调用时都会被 JITted,这当然会带来时间损失。在那之后,没有太多理由说明代码应该比直接编译为本机二进制文件的等效代码运行得慢。是的,正是@Guffa 的意思,他只是比我更快(而且更少冗长)..
-
@Guffa, Paul Michalik - 执行时间在 3 到 5 秒之间。
标签: c# performance x86 cil ildasm