使用排序的我的C程序第一次运行速度比其他时间慢10倍。它使用整数文件进行排序,即使我更改数字,程序仍然运行得更快。当我重新启动PC时,第一次程序运行速度慢了10倍。我使用time
来计算时间。
答案 0 :(得分:13)
操作系统将数据保存在RAM中,即使它不再需要(这称为“缓存”),因此当程序再次运行时,它从那里获取所有数据,并且没有磁盘I / O.即使您更改数据,该更改也会首先在RAM中发生,并且即使在写入文件后也会保留在那里。
但是,请注意,它不会永久停留在RAM中。如果其他内容需要内存,则删除缓存。此时,需要磁盘访问(此时它再次缓存在RAM中。)这就是重启后首次访问总是很慢的原因;数据尚未缓存,因为它从未从文件中读取过。
答案 1 :(得分:2)
你必须做出假设并将它们面对现实。你可以合理地做的第一个是它确实闻起来很像缓存问题!
问自己这些问题:
我的数据是否适合HDD内部缓存?
最容易丢弃的假设是FS缓存。在linux下,只需在每次调用程序之间发出sync; echo 3 > /proc/sys/vm/drop_caches
。第一个将确保缓存的数据将进入物理介质(硬盘驱动器),第二个将从内存中删除文件系统缓存的内容。
“物理介质”可能是硬盘缓存本身,所以要小心......在linux下,您可以使用命令hdparm -W 0 <device>
禁用此“回写”缓存,例如,如果您正在工作使用驱动器sda
,hdparm -W 0 /dev/sda
将完成这项工作。您可能希望在完成测试后重新启用它:)
另一个假设是CPU缓存,请查看How can I do a CPU cache flush in x86 Windows?和How to clear CPU L1 and L2 cache
嗯,它可能是也可能不是其中之一,但它并没有伤害尝试:)
答案 2 :(得分:1)
我有一个非常相似的问题,但是我没有加载大文件-所以我在很长的首次执行时间就感到困惑(缓存不可能是问题)。
此answer为我指明了正确的方向-这是我的实时防病毒保护。每次我重新编译程序时,它将重新扫描它为潜在恶意软件。我将项目路径作为“例外”添加到了Avira(以我为例)的实时病毒防护中。
首次执行时,程序执行迅速了!
答案 3 :(得分:0)
这不是什么新鲜事,不只是你的程序很多流行的商业软件都面临这个问题。
首先检查此MATLAB Article about slow fist time execution
如果其他编程语言在C#或Java等虚拟机上运行,这种情况很常见。 http://en.wikipedia.org/wiki/Just-in-time_compilation#Startup_delay_and_optimizations
缓存是在C中发生这种情况的一个很好的理由但是10x的持续时间相当长。重启后系统可能还在加载其他资源。
重启后10分钟后应该运行程序以获得更好的效果。到那时,所有启动应用程序都将被加载。 (10分钟----取决于启动应用程序的数量和启动每个应用程序所需的时间)
答案 4 :(得分:0)
如果您的程序进行网络访问,则可能是初始延迟的原因。许多网络协议需要时间来设置。一些例子:
从这里你可以使用一些低级别的跟踪工具来查看花费的时间。在linux上,一个基本工具是strace -r
。其他系统可能有一些类似的工具。您的编译器还必须附带一个分析器(即gprof
用于GCC或Valgrind)。
答案 5 :(得分:0)
这是因为编译器的优化,它的作用是缓存Temoparal Locality
的结果并保存激活记录,也节省了时间,因为在链接阶段必须重新加载绑定对象
答案 6 :(得分:0)
测量时间有两个组成部分
如果您正在从磁盘读取文件,并将其加载到内存中 - 并进行排序:
1)阅读文件的时间&amp;将它存储在一个数组中 2)分拣时间
这些是分别测量的吗?
你能看看吗? Invalidating Linux Buffer Cache
如果重复清除缓存的实验会产生相同的结果,而不是重新启动,那么您可以推断出文件缓冲区缓存效果没有被考虑在内。