6

我正在拼命寻找便宜的方法来降低我家用 PC 的构建时间。我刚刚阅读了一篇关于在 Windows XP 上禁用文件的 Last Access Time 属性的文章,这样简单的读取就不会将任何内容写回磁盘。

这也很简单。在 DOS 提示符下写入:

fsutil behavior set disablelastaccess 1

有没有人在构建 C++ 项目的环境中尝试过它?有什么缺点吗?

[编辑] 更多关于这里的主题。

4

9 回答 9

7

来自SetFileTime 的文档

“NTFS 将文件的最后一次访问时间的更新延迟到最后一次访问后一小时。”

关闭它没有任何意义 - 原始文章是错误的,数据并未在每次访问时都写出。

编辑:

至于为什么那篇文章的作者声称加速了 10 倍,我认为他将他的加速归因于错误的事情:他还禁用了 8.3 文件名生成。要为文件生成 8.3 文件名,NTFS 基本上必须依次生成每种可能性,然后查看它是否已经在使用中(没有参考;我确信Raymond已经讨论过它,但找不到链接)。如果您的文件都共享相同的前六个字符,那么您将被这个问题所困扰,并且推论是您应该将区分文件的字符放在前六个字符中,这样它们就不会发生冲突。关闭短名称生成将防止这种情况发生。

于 2008-09-17T11:02:27.847 回答
4

我还没有在 Windows 机器上尝试过这个(我今晚会,谢谢),但是 Linux 上的类似事情(安装驱动器时的 noatime 选项)大大加快了速度。

除了用于审计目的之外,我想不出最后一次访问时间有用的任何用途,即便如此,Windows 是否会存储访问它的用户?我知道Linux没有。

于 2008-09-17T08:37:37.913 回答
4

我建议你尝试一下,看看它是否有所作为。

但是我对这实际上会产生什么影响感到悲观,因为在更大/干净的构建中,无论如何您都会写出大量数据,因此调整文件访问时间不会花费太多时间(加上它可能无论如何都要缓存)。

不过,我很想被证明是错误的。


结果:

在启用和禁用最后访问时间的调试和发布配置中,在工作中的代码库上运行了一些构建。

我们的源代码大约为 39 MB(磁盘大小为 48 MB),我们为我为这些测试构建的配置构建了大约一半的代码。调试版本生成了1.76 GB的临时和输出文件,而发布版本生成了大约 600 MB 的此类数据。我们使用 Ant 和 Visual Studio 命令行构建工具的组合在命令行上构建。

我的机器是 Core 2 Duo 3GHz,4GB 内存,7200rpm 硬盘,运行 Windows XP 32 位。

禁用上次访问时间的建筑物:

调试时间 = 6:17、5:41

发布时间 = 6:07、6:06

启用最后访问时间的构建:

调试时间 = 6:00、5:47

发布时间 = 6:19、5:48

总的来说,我没有注意到这两种模式之间有任何区别,因为在这两种情况下,文件很可能已经在系统缓存中,所以它应该只是从内存中读取。

我相信,只要实现适当的预编译头文件(而不是 Visual Studio 在项目中创建的自动生成的头文件),您将获得最大的收益。几年前我们在工作中实现了这一点(当时代码库要小得多),它将我们的构建时间减少到原来的三分之一。

于 2008-09-17T08:40:06.330 回答
1

这是一个很好的选择,但它会影响一些工具。像远程存储服务和其他依赖文件访问统计来优化文件系统的实用程序(即 Norton Defrag)

于 2008-09-17T09:14:12.613 回答
0

我不想将注意力从“最后访问时间”问题上移开,但可能还有其他方法可以加快构建速度。不知道上下文和您的项目设置,很难说什么可能很慢,但可能有一些事情可能会有所帮助:

创建“超级”构建。也就是说,创建一个包含一堆行的单个编译 uber.cpp 文件,例如

#include "file1.cpp"
#include "file2.cpp"

您可能会遇到静态变量名称冲突的问题,但这些通常很容易解决。初始设置有点痛苦,但构建时间会显着增加。对我们来说,最大的缺点是在开发人员工作室中,如果该文件是 uber 构建的一部分,您不能右键单击文件并说“编译”。不过这没什么大不了的。我们为“uber”构建提供了单独的构建配置,它们编译了 uber 文件,但从构建过程中排除了单个 cpp 文件。如果您需要更多信息,请发表评论,我可以为您提供。此外,优化器倾向于在 uber 构建中做得更好。

另外,您是否有大量包含文件,或者包含文件之间有很多依赖关系?如果是这样,那将大大减慢构建时间。

你在使用预编译的头文件吗?如果没有,您可能会将其视为一种解决方案,因为这也会有所帮助。

缓慢的构建时间通常归因于大量的文件 I/O。到目前为止,这是构建中最大的时间消耗——只是打开、读取和解析所有文件。如果您减少文件 I/O,您将​​缩短构建时间。

无论如何,很抱歉稍微偏离主题,但是手头上更改文件最后访问时间设置方式的建议似乎有点像“大锤”解决方案。

于 2008-09-17T13:17:11.377 回答
0

它将稍微提高性能。除此之外,它不会做更多的事情(当然,您将无法看到文件最后一次访问的时间)。当我使用nLite安装 Windows XP以消除我不需要的臃肿时,我默认将其关闭。

于 2008-09-17T08:45:20.983 回答
0

对于繁忙的服务器,禁用上次访问时间通常是一个好主意。唯一潜在的缺点是是否有脚本使用上次访问时间来告知文件不再被写入。

也就是说,如果您希望缩短 C++ 项目的构建时间,我强烈建议您阅读Recursive Make Considered Harmful。这篇文章大约有十年的历史,但它关于我们构建脚本中的递归定义如何导致构建时间长的观点仍然值得理解。

于 2008-09-18T06:59:57.233 回答
0

禁用访问时间在使用 ssd(固态驱动器 - 卡、USB 驱动器等)时很有用,因为它减少了对驱动器的写入次数。所有固态存储设备的寿命都是通过可以对每个单独地址进行的写入次数来衡量的。一些媒体指定至少为 100 的数千,甚至 100 万。操作系统和其他可执行文件可以在单个操作中访问许多文件以及用户文档访问。这将适用于eee pc、嵌入式系统和其他。

于 2009-03-12T13:02:06.577 回答
-1

致迈克·迪米克:

尝试将 USB 驱动器与许多文件连接并将它们复制到您的内部驱动器。除了程序编译(在原始帖子中描述)之外,情况也是如此。

于 2010-01-15T10:36:07.503 回答