为啥当天的第一个编译比下一个编译慢?

Posted

技术标签:

【中文标题】为啥当天的第一个编译比下一个编译慢?【英文标题】:Why is the first compilation of the day slower than next ones?为什么当天的第一个编译比下一个编译慢? 【发布时间】:2016-01-20 08:17:21 【问题描述】:

多年来,我几乎所有的 C 和 C++ 项目都在使用 GCC/G++,但有一点我一直不明白:在机器启动后第一次使用其中一个总是需要一两次在您关闭计算机之前,比每次下一次编译都要多几秒钟。

因为一天只有一次,所以并不麻烦,但我只是想知道为什么。它会初始化任何东西然后重新使用它吗? 如果是,它会在某处保存一些东西吗? 如果是,为什么每天都要重新初始化?

【问题讨论】:

各种级别的缓存 - 文件、动态库等。此外,目前还有行星对齐。 开发人员都是一样的——他们在喝完第二杯咖啡之前都很慢。 你使用的是什么操作系统? @BasileStarynkevitch 目前我使用的是 Ubuntu 15.10,但我注意到我使用的每一个 Linux。 【参考方案1】:

特别是因为page cache。如果您有足够的 RAM,大部分数据(包括您的源代码文件和目标文件)往往会保留在那里。

如果这让您感到困扰,请使用一些 SSD 磁盘和/或在喝咖啡的同时运行首先您第一次编译一个读取所有源代码的命令之前,例如在 Linux 上 wc *.cc (你甚至可以使用 @reboot 使其成为 crontab 工作);另请阅读http://linuxatemyram.com/

您也可以使用 suspend-to-disk 工具而不是 shutdown:但我认为这不值得(而且我喜欢 @987654326 @在启动时被清理)

(我猜测或希望您正在使用带有本机文件系统的 Linux,例如 Ext4 或 BTRFS)

【讨论】:

【参考方案2】:

简短的回答是缓存,可能在多个级别。

例如,许多现代硬盘驱动器都有内置缓存,因此如果重复读取某些数据(例如 gcc 可执行文件、库、makefile、源文件),第一次访问将导致数据在设备中缓存,后续操作将与缓存交互,而不是从盘片中读取。缓存上的操作必须比定位驱动盘片读取更快。

许多操作系统也实现了某种形式的页面缓存,它做类似的事情(只是使用系统 RAM 作为缓存)。

大多数现代机器都有不同级别的缓存(在设备中、由操作系统管理、CPU 中的多个缓存级别等)。

缓存可以根据配置影响读取和写入操作。影响写入的缓存(写入操作实际上写入缓存并返回,并在以后提交 - 例如驱动器)是操作系统需要显式关闭的部分原因,因此它们提交所有缓存的写入。

【讨论】:

以上是关于为啥当天的第一个编译比下一个编译慢?的主要内容,如果未能解决你的问题,请参考以下文章

linux下cmake编译opencv 为啥这么慢

为啥 Swift 编译时间这么慢?

为啥delphi xe8 编译android软件非常慢

为啥eclipse编译的时候那么慢

为啥编译的 python 正则表达式比较慢?

为啥这个 AVX 代码比较慢?