XP上的文件:关闭"上次访问时间"是否安全?

时间:2020-03-05 18:58:17  来源:igfitidea点击:

我正在拼命寻找便宜的方法来减少家用PC的构建时间。我刚刚读了一篇有关在Windows XP上禁用文件的"上次访问时间"属性的文章,这样简单的读取就不会将任何内容写回到磁盘上。

It's really simple too. At a DOS-prompt write:
  
  fsutil behavior set disablelastaccess 1

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

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

解决方案

回答

我没有在Windows机器上尝试过此操作(谢谢,今晚会来),但是Linux上的类似操作(安装驱动器时使用noatime选项)大大加快了速度。

我无法想到除了访问目的之外,最后访问时间会有用的任何用途,即使如此,Windows也会存储访问它的用户吗?我知道Linux没有。

回答

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

但是我对此并不乐观,因为在较大/干净的版本中,无论如何我们都会写出大量数据,因此调整文件访问时间不会花费那么多时间(而且可能无论如何都会被缓存)。

我很想证明自己是错的。

结果:

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

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

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

Building with the last access time disabled:
  
  Debug times = 6:17, 5:41
  
  Release times = 6:07, 6:06
  
  Building with the last access time enabled:
  
  Debug times = 6:00, 5:47
  
  Release times = 6:19, 5:48

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

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

回答

它会稍微改善性能。除此之外,它不会做更多的事情(当然,我们将无法看到上次访问文件的时间)。默认情况下,当我使用nLite安装Windows XP时,我不需要打开它。

回答

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

回答

从SetFileTime的文档中:

" NTFS将对文件的最后访问时间的更新延迟最多一次访问后的一小时。"

关闭原始文章是没有道理的,这并不是每次访问都会写出数据。

编辑:

至于为什么该文章的作者声称速度提高了10倍,我认为他将速度提高归因于错误的事情:他还禁用了8.3文件名生成。要为文件生成8.3文件名,NTFS必须依次生成每种可能性,然后查看其是否已在使用(无参考;我确定Raymond谈论过它,但找不到链接)。如果文件都共享相同的前六个字符,那么我们将受到这个问题的困扰,而麻烦的是,我们应该在前六个字符中放置区分文件的字符,以免它们冲突。关闭短名称生成将防止这种情况。

回答

我不想引起人们对"上次访问时间"问题的关注,但是可能还有其他方法可以加快构建速度。不知道上下文和项目设置,很难说什么可能很慢,但是可能有些事情可能会有所帮助:

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

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

我们可能会遇到冲突的静态变量名称的麻烦,但是这些变量通常很容易理清。初始设置有点麻烦,但是构建时间会急剧增加。对于我们来说,最大的缺点是,在Developer Studio中,如果该文件是uber构建的一部分,则无法右键单击该文件并说"编译"。不过这没什么大不了的。我们为" uber"构建提供了单独的构建配置,这些配置可编译uber文件,但从构建过程中排除单个cpp文件。如果我们需要更多信息,请发表评论,我可以。同样,优化器在使用超级编译器时往往会做得更好。

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

我们是否在使用预编译的头文件?如果没有,我们可能会考虑将其作为解决方案,因为这也会有所帮助。

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

无论如何,对不起,使该主题稍有偏离,但是手头上关于更改文件的最后访问时间设置方式的建议似乎有点像"大锤"解决方案。

回答

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

就是说,如果我们希望缩短C ++项目的构建时间,我强烈建议我们阅读"使递归视为有害"。这篇文章已有十多年的历史了,但是它提出的关于构建脚本中的递归定义如何导致较长构建时间的观点仍然值得我们理解。

回答

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

回答

致迈克·迪米克(Mike Dimmick):

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