如何使Windows能够与Linux一样快地进行C++编译?

以下为机翻内容,原文详细内容请访问文末的链接:

================

我从事一个相当大的跨平台项目。在Windows上,我使用VC ++2008。在Linux上,我使用gcc。该项目中大约有40k个文件。Windows在编译和链接同一项目时比Linux慢10到40倍。我该如何解决?

在Linux上一次更改增量构建20秒,在Windows上一次增量构建3分钟。为什么?我什至可以在Linux中安装“ gold”链接器,并将时间缩短到7秒。

同样,在Linux上,git比Windows快10到40倍。

在git的情况下,可能git不是以最佳方式使用Windows,而是VC ++?您可能会认为Microsoft希望使自己的开发人员尽可能高效,而更快的编译将大大有助于实现这一目标。也许他们正在尝试鼓励开发人员使用C#?

作为一个简单的测试,找到一个包含很多子文件夹的文件夹,然后做一个简单的

dir /s > c:\list.txt
在Windows上。进行两次,并为第二次运行计时,以便它从缓存中运行。将文件复制到Linux并进行等效的2次运行,并安排第二次运行的时间。

ls -R > /tmp/list.txt
我有2个具有完全相同规格的工作站。配备12gig内存,8核,3.0GHz的HP Z600s。在具有约40万个文件的文件夹中,Windows需要40秒,而Linux需要不到1秒。

我可以设置注册表设置来加快Windows速度吗?是什么赋予了?

一些与编译时间相关的稍微相关的链接,不一定是I / O。

显然,在Windows 10(不是Windows 7)中存在一个问题,即关闭进程持有全局锁。当使用多个内核进行编译时,因此会涉及多个进程,因此会遇到此问题。

该/analyse选项可能会影响性能,因为它会加载Web浏览器。(此处不相关,但很高兴知道)


除非有Windows系统的顽固黑客,否则您将获得的不仅仅是党派评论(我不会做)和猜测(这是我将要尝试的)。

文件系统-您应该在同一文件系统上尝试相同的操作(包括dir)。我碰到了这一点,它针对各种参数对一些文件系统进行了基准测试。

正在缓存。我曾经尝试在RAM磁盘上的Linux上运行编译,但发现由于内核负责缓存的原因,编译速度比在磁盘上运行慢。这是Linux的可靠卖点,可能是性能如此不同的原因。

Windows上的依赖项规范不正确。也许Windows的铬依赖规范不如Linux正确。进行小的更改时,可能会导致不必要的编译。您可能能够使用Windows上相同的编译器工具链来验证这一点。


一些想法:

禁用8.3名称。对于具有大量文件和相对较少文件夹的驱动器,这可能是一个很大的因素:fsutil behavior set disable8dot3 1
使用更多文件夹。以我的经验,NTFS开始减速,每个文件夹约有1000个文件。
使用MSBuild启用并行构建;只需添加“ / m”开关,它将自动为每个CPU内核启动一份MSBuild。
将文件放在SSD上-极大地帮助进行随机I / O。
如果您的平均文件大小远大于4KB,请考虑使用更大的群集大小重建文件系统,该大小大约与您的平均文件大小相对应。
确保已对文件进行碎片整理。碎片文件会导致大量磁盘寻道,这可能使您的吞吐量损失40倍以上。使用sysinternals中的“ contig”实用程序或内置的Windows碎片整理程序。
如果您的平均文件大小很小,并且您所在的分区相对较满,则可能是由于碎片化的MFT而运行的,这不利于性能。同样,小于1K的文件直接存储在MFT中。上面提到的“ contig”实用程序可以提供帮助,或者您可能需要增加MFT大小。下面的命令会将其加倍,达到音量的25%:fsutil behavior set mftzone 2将最后一个数字更改为3或4,以使大小额外增加12.5%。运行命令后,重新引导,然后创建文件系统。
禁用上次访问时间: fsutil behavior set disablelastaccess 1
禁用索引服务
禁用防病毒和反间谍软件,或者至少将相关文件夹设置为忽略。
将文件与操作系统和页面文件放在不同的物理驱动器上。使用单独的物理驱动器,Windows可以对两个驱动器使用并行I / O。
看一下您的编译器标志。Windows C ++编译器有很多选项。确保只使用您真正需要的那些。
尝试增加操作系统用于页面缓冲池的内存量(确保首先有足够的RAM): fsutil behavior set memoryusage 2
检查Windows错误日志,以确保您没有遇到偶然的磁盘错误。
查看与物理磁盘相关的性能计数器,以了解磁盘的繁忙程度。队列长度过长或每次传输时间长都是不好的迹象。
就原始传输时间而言,磁盘分区的前30%比其余磁盘要快得多。较窄的分区还有助于最大程度地减少寻道时间。
您是否在使用RAID?如果是这样,您可能需要优化RAID类型的选择(RAID-5不利于诸如写入之类的写操作繁重的操作)
禁用不需要的任何服务
碎片整理文件夹:将所有文件复制到另一个驱动器(仅文件),删除原始文件,将所有文件夹复制到另一个驱动器(仅空文件夹),然后删除原始文件夹,对原始驱动器进行碎片整理,首先将文件夹结构复制回,然后复制文件。当Windows一次生成一个大文件夹时,这些文件夹最终会变得零散且缓慢。(“ contig”也应在此提供帮助)
如果您受I / O限制,并且有CPU周期可用,请尝试打开磁盘压缩。它可以为高度可压缩的文件(例如源代码)提供一些显着的加速,并且会占用一些CPU成本。

======================

参考来源:

    https://stackoverflow.com/questions/6916011/how-do-i-get-windows-to-go-as-fast-as-linux-for-compiling-c
posted @ 2022-02-14 21:04  晴云孤魂  阅读(548)  评论(0编辑  收藏  举报