C# 第一次执行需要更多时间

问题描述 投票:0回答:2

我注意到我的 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);
}
c# performance execution-time
2个回答
12
投票

首次执行包括即时 (JIT) 编译器将代码从 Microsoft 中间语言 (MSIL) 转换为运行代码的任何机器的本机可执行机器代码所花费的时间。

所有后续调用都将重新使用已编译的代码。


1
投票

我的评论迟到了,但希望它们可以帮助别人。

如果清除内存然后再次运行程序,您将不会看到在后续运行中看到的节省。

这是一个例子。

我编写了一个小程序,可以遍历驱动器上的所有文件夹并计算图像文件占用的总大小。在随后的运行中,程序的运行速度比第一次运行快得多。然而,它的意义远不止上面讨论的 JIT 想法。

.Net 似乎在第一次运行期间存储了一个执行计划,并使用它来优化后续运行。因此,当我将文件夹从 d:\work 更改为 e:\work 时,所需时间几乎与第一次运行相同(注意 - 对路径的更改是在配置文件中进行的,因此不需要重新编译,并且 d:\ work 的大小与 e:\work 类似)。当路径改回 d:\work 时,.Net 在更短的时间内执行了它。

© www.soinside.com 2019 - 2024. All rights reserved.