为什么今天的第一次编辑比下一次编译慢?

时间:2016-01-20 08:17:22

标签: c++ c gcc compilation

我几年来几乎所有的C和C ++项目都使用GCC / G ++,并且有一些我从未理解过的东西:在机器启动后首次使用其中一个项目总是需要一两个在关闭计算机之前,每个下一次编译都会超过几秒钟。

由于它只是一天一次,它并不是真的很麻烦,但我只是想知道为什么。它是否初始化并重新使用它? 如果是的话,它会在某处保存一些东西吗? 如果是的话,为什么每天必须重新初始化它?

2 个答案:

答案 0 :(得分:3)

值得注意的是page cache。如果你有足够的RAM,大多数数据(包括你的源代码文件和目标文件)都会留在那里。

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

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

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

答案 1 :(得分:2)

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

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

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

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

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