我在写测试代码时注意到的一点是,长时间运行的操作在第一次运行程序时比在后续运行时运行时间长,有时是10倍或更多。显然,这里有一些冷缓存/热缓存问题,但我似乎无法弄清楚它是什么。
它不是cpu缓存,因为这些长时间运行的操作往往是循环,我喂大量的数据,他们应该在第一次迭代后完全加载。 (加上,卸载和重新加载程序应该清除缓存。)
此外,它不是磁盘缓存。我已经通过加载所有的数据从盘前面和处理它以后,它是实际的cpu绑定数据处理缓慢地排除。
所以什么可以导致我的程序运行缓慢,我第一次运行它,但是如果我关闭它并再次运行它,它运行快得多?我在几个不同的程序中看到了这个,做了很不同的事情,所以它似乎是一个一般的问题。
编辑:为澄清,我在Delphi写,虽然我真的不认为这是一个Delphi的具体问题。但这意味着,无论什么问题,它不与JIT问题,垃圾收集问题或托管代码带来的任何其他行李有关。我不处理网络连接。这是纯cpu限制处理。
一个例子:脚本编译器。它运行像这样:
>将整个文件从光盘加载到内存中
> Lex将整个文件放入一个令牌队列
>将队列解析成树
>在树上运行codegen以生成字节码
如果我把一个庞大的脚本文件(〜100k行),从光盘加载到内存中,lex步骤需要大约15秒的第一次我运行,2秒的后续运行。 (是的,我知道这还有很长一段时间,我正在努力…)我想知道这个减速来自哪里,我可以做什么。