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

c# takes more time to do first execution

我注意到我的 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 会在更短的时间内执行它。