窗口 – 什么可以导致程序第二次运行更快?

我在写测试代码时注意到的一点是,长时间运行的操作在第一次运行程序时比在后续运行时运行时间长,有时是10倍或更多。显然,这里有一些冷缓存/热缓存问题,但我似乎无法弄清楚它是什么。

它不是cpu缓存,因为这些长时间运行的操作往往是循环,我喂大量的数据,他们应该在第一次迭代后完全加载。 (加上,卸载和重新加载程序应该清除缓存。)

此外,它不是磁盘缓存。我已经通过加载所有的数据从盘前面和处理它以后,它是实际的cpu绑定数据处理缓慢地排除。

所以什么可以导致我的程序运行缓慢,我第一次运行它,但是如果我关闭它并再次运行它,它运行快得多?我在几个不同的程序中看到了这个,做了很不同的事情,所以它似乎是一个一般的问题。

编辑:为澄清,我在Delphi写,虽然我真的不认为这是一个Delphi的具体问题。但这意味着,无论什么问题,它不与JIT问题,垃圾收集问题或托管代码带来的任何其他行李有关。我不处理网络连接。这是纯cpu限制处理。

一个例子:脚本编译器。它运行像这样:

>将整个文件从光盘加载到内存中
> Lex将整个文件放入一个令牌队列
>将队列解析成树
>在树上运行codegen以生成字节码

如果我把一个庞大的脚本文件(〜100k行),从光盘加载到内存中,lex步骤需要大约15秒的第一次我运行,2秒的后续运行。 (是的,我知道这还有很长一段时间,我正在努力…)我想知道这个减速来自哪里,我可以做什么。

解决方法

三件事要试:

>在采样分析器中运行它,包括“冷”运行(重新启动后的第一件事)。通常应该足够了。>检查内存使用情况,它是否增长如此之高(即使是瞬态)操作系统将不得不交换内存,为您的应用程序腾出空间?这本身就可以解释你所看到的。还要看看,当你启动你的应用程序,你有免费的内存量。>启用系统性能工具并检查I / O计数器或文件访问,并确保在FileMon / Process Explorer下没有您忘记的某些文件网络访问(剩余日志/测试代码)

相关文章

ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c++ 调用, 抽空研究了一下该库的最新版 ,把...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的功能是:将源操作数送到目的操作数中,即:...
有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因为使用复杂...
API原型: Declare Function MoveFileEx& Lib "kernel32" Alias "MoveFileExA" (By...