我注意到当我测试所写的代码时,长时间运行的操作在第一次运行程序时比后续运行要慢得多,有时甚至慢了10倍以上。显然这里涉及到某种冷缓存/热缓存问题,但我似乎无法弄清楚是什么问题。
这不是CPU缓存,因为这些长时间运行的操作往往是循环,我向其中输入大量数据,并且它们在第一次迭代后应该被完全加载(此外,卸载和重新加载程序应该会清除缓存)。
而且,这也不是磁盘缓存。我通过预先从磁盘加载所有数据并在处理之后进行了排除,并且实际上是CPU密集型的数据处理在缓慢执行。
那么是什么原因导致我的程序在第一次运行时运行缓慢,但如果我关闭它并再次运行,则运行速度会显着提高呢?我在几个不同的程序中都看到过这种情况,这似乎是一个普遍性问题。
编辑:为了澄清,我是用Delphi编写的,尽管我不认为这是一个特定于Delphi的问题。但这意味着无论问题是什么,它都与JIT问题、垃圾回收问题或托管代码带来的任何其他问题都无关。而且我没有涉及网络连接。这是纯CPU密集型处理。
一个例子:脚本编译器。它的运行方式如下:
- 将整个文件从磁盘加载到内存中。 - 将整个文件分析为令牌队列。 - 将队列解析成树。 - 在树上运行codegen以生成字节码。
如果我向其输入一个巨大的脚本文件(~100k行),在将整个文件从磁盘加载到内存后,第一次运行时Lex步骤大约需要15秒,而后续运行则只需2秒。(是的,我知道那还是很长时间。我正在努力改进...)我想知道这种减速来自哪里以及我可以怎么做。
这不是CPU缓存,因为这些长时间运行的操作往往是循环,我向其中输入大量数据,并且它们在第一次迭代后应该被完全加载(此外,卸载和重新加载程序应该会清除缓存)。
而且,这也不是磁盘缓存。我通过预先从磁盘加载所有数据并在处理之后进行了排除,并且实际上是CPU密集型的数据处理在缓慢执行。
那么是什么原因导致我的程序在第一次运行时运行缓慢,但如果我关闭它并再次运行,则运行速度会显着提高呢?我在几个不同的程序中都看到过这种情况,这似乎是一个普遍性问题。
编辑:为了澄清,我是用Delphi编写的,尽管我不认为这是一个特定于Delphi的问题。但这意味着无论问题是什么,它都与JIT问题、垃圾回收问题或托管代码带来的任何其他问题都无关。而且我没有涉及网络连接。这是纯CPU密集型处理。
一个例子:脚本编译器。它的运行方式如下:
- 将整个文件从磁盘加载到内存中。 - 将整个文件分析为令牌队列。 - 将队列解析成树。 - 在树上运行codegen以生成字节码。
如果我向其输入一个巨大的脚本文件(~100k行),在将整个文件从磁盘加载到内存后,第一次运行时Lex步骤大约需要15秒,而后续运行则只需2秒。(是的,我知道那还是很长时间。我正在努力改进...)我想知道这种减速来自哪里以及我可以怎么做。