我注意到我的 C# 应用程序有一个不寻常的事情。我第一次执行某些代码比后续执行花费的时间要长得多。谁能给我解释一下这是为什么吗?
在下面的简单测试应用程序中甚至可以看到它,我得到的初始输出约为 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);
}
首次执行包括即时 (JIT) 编译器将代码从 Microsoft 中间语言 (MSIL) 转换为运行代码的任何机器的本机可执行机器代码所花费的时间。
所有后续调用都将重新使用已编译的代码。
我的评论迟到了,但希望它们可以帮助别人。
如果清除内存然后再次运行程序,您将不会看到在后续运行中看到的节省。
这是一个例子。
我编写了一个小程序,可以遍历驱动器上的所有文件夹并计算图像文件占用的总大小。在随后的运行中,程序的运行速度比第一次运行快得多。然而,它的意义远不止上面讨论的 JIT 想法。
.Net 似乎在第一次运行期间存储了一个执行计划,并使用它来优化后续运行。因此,当我将文件夹从 d:\work 更改为 e:\work 时,所需时间几乎与第一次运行相同(注意 - 对路径的更改是在配置文件中进行的,因此不需要重新编译,并且 d:\ work 的大小与 e:\work 类似)。当路径改回 d:\work 时,.Net 在更短的时间内执行了它。