XP上的文件:关闭“上次访问时间”安全吗?

时间:2008-09-17 08:34:43

标签: c++ performance file-io windows-xp

我正在拼命寻找降低家用电脑上构建时间的廉价方法。我刚刚在Windows XP上阅读了article about disabling the Last Access Time attribute文件,因此简单的读取不会将任何内容写回磁盘。

  

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

     

fsutil behavior set disablelastaccess 1

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

[编辑]有关here主题的更多信息。

9 个答案:

答案 0 :(得分:7)

来自SetFileTime's documentation

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

没有真正关闭这一点 - 原始文章是错误的,每次访问都不会写出数据。

编辑:

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

答案 1 :(得分:4)

我没有在Windows机器上试过这个(今晚我会来,谢谢)但Linux上的类似内容(安装驱动器时的noatime选项)加速相当

除了审计目的之外,我想不出上次访问时间有用的任何用途,即便这样,Windows会存储访问它的用户吗?我知道Linux没有。

答案 2 :(得分: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在项目中创建的自动生成的头),您将获得最大的收益。我们几年前在工作中实现了这一点(当代码库小得多时),它将我们的构建时间减少到原来的三分之一。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

它会稍微改善性能。除此之外,它不会做更多的事情(当然,你无法看到文件上次访问的时间)。当我使用nLite安装Windows XP来切断我不需要的膨胀时,默认情况下已经关闭了。

答案 5 :(得分:0)

我不想引起人们对“上次访问时间”问题的注意,但可能还有其他方法可以加快构建速度。不知道上下文和项目设置,很难说什么可能很慢,但可能会有一些可能有用的东西:

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

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

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

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

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

缓慢的构建时间通常跟踪到大量文件I / O.到目前为止,这是构建中最大的时间 - 只需打开,读取和解析所有文件。如果减少文件I / O,则可以缩短构建时间。

无论如何,很抱歉略微破坏了这个话题,但是手头的建议改变了文件的最后访问时间的设置似乎有点像“大锤”的解决方案。

答案 6 :(得分:0)

对于繁忙的服务器,禁用上次访问时间通常是一个好主意。唯一可能的缺点是,如果有脚本使用上次访问时间,例如,告诉文件不再被写入。

也就是说,如果您希望改善C ++项目的构建时间,我强烈建议您阅读Recursive Make Considered Harmful。这篇文章已经有十年之久了,但是关于如何在构建脚本中使用递归定义导致构建时间长的问题仍然值得理解。

答案 7 :(得分:0)

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

答案 8 :(得分:-1)

Mike Dimmick:

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