我注意到我的c#app有点不寻常。我第一次执行某些代码比后续执行需要更长的时间。任何人都可以向我解释为什么会这样吗?
通过我下面的简单测试应用程序甚至可以看到它的初始输出大约为13,后续输出大约为3。
Stopwatch sw;
int count = 0;
private void Window_KeyUp(object sender, KeyEventArgs e)
{
RunTest();
}
private void RunTest()
{
sw = Stopwatch.StartNew();
count = 0;
for (int i = 0; i < 100; i++)
{
count++;
}
Console.WriteLine(sw.ElapsedTicks);
}
答案 0 :(得分:11)
第一次执行包括Just In Time(JIT)编译器将代码从Microsoft的中间语言(MSIL)转换为您运行代码的任何机器的本机可执行机器代码所花费的时间上。
所有后续调用都在重用已编译的代码。
答案 1 :(得分:1)
我的评论迟到了,但希望他们可以帮助别人。
如果您清理内存然后再次运行程序,您将看不到在后续运行中看到的节省。
这是一个例子。
我编写了一个小程序,遍历驱动器上的所有文件夹,并计算图像文件占用的总大小。在后续运行中,与第一次运行相比,程序运行得更快。然而,除了上面讨论的JIT思想之外,还有更多内容。
.Net似乎在第一次运行期间存储执行计划,并使用它来优化后续运行。因此,当我将文件夹从d:\ work更改为e:\ work时,它几乎与第一次运行所花费的时间相同(注意 - 路径的更改在配置文件中进行,因此不需要重新编译,并且d:\工作的大小与e:\ work相似。当路径改回d:\ work时,.Net在较短的时间内执行它。