【发布时间】:2016-09-12 18:36:37
【问题描述】:
我正在处理一个项目,该项目包含数千个 .cpp 文件以及数千个 .h 和 .hpp,构建需要 28 分钟 从 SSD 运行。
几周前,我们从另一家公司继承了这个项目,但仔细阅读了 makefile,他们通过 .NOPARALLEL 假目标明确禁用了并行构建;我们正在尝试找出他们是否有充分的理由。
在最坏的情况下,加快速度的唯一方法是使用 RAM 驱动器。
所以我按照Tekrevue 的说明安装了Imdisk,然后使用CrystalDiskMark 运行基准测试:
我还使用 Cygwin 运行 dd,与我的 SSD 相比,RAM 驱动器的速度显着提高(至少 3 倍)。
但是,我的构建时间不会改变一分钟!
然后我想:也许我的专有编译器调用了一些 Windows API 并导致速度大大降低,所以我在 Cygwin 上从源代码构建了 fftw。
我的预期是我的处理器使用率会增加到某个最大值并在构建期间保持在那里。相反,我的用法非常尖锐:每个编译的文件一个。我知道即使 Cygwin 仍然必须与 Windows 交互,所以我仍然使用尖峰 proc 的事实让我认为问题不是我的编译器。
好的。新理论:为每个源文件调用编译器在 Windows 中有一些巨大的开销,因此,我从我的构建日志中复制粘贴并将 45 个文件传递给我的编译器,并将其与分别调用编译器 45 次进行比较。调用 ONCE 速度更快,但 45 个文件总共只用了 4 秒。 而且我看到了与为每个文件调用一次编译器时相同的“尖峰”处理器使用情况。
为什么即使从 RAM 驱动器运行,编译器也不能更快地运行?开销是多少?
更新 #1 我认为,评论者一直在说,RAM 驱动器是一种不必要的 bc 窗口无论如何都会将输入和输出文件缓存在 RAM 中。 另外,RAM 驱动器的实现(即驱动程序)可能不是最理想的。 所以,我不再使用 RAM 驱动器了。
另外,人们说我应该多次运行 45 文件构建以消除缓存开销:我运行了 4 次,每次都是 52 秒。
虚拟内存使用 当编译器将内容输出到磁盘时,它实际上首先缓存在 RAM 中,对吗? 那么这个屏幕截图表明 IO 不是问题,或者更确切地说,它和我的 RAM 一样快。
问题: 因此,既然一切都在 RAM 中,为什么 CPU % 没有更多的时间呢? 我可以做些什么来加快单线程/作业构建速度吗? (记住现在是单线程构建)
更新 2 下面建议我应该将我的 compile-45-files 调用的关联性设置为 1,这样 Windows 就不会在调用时反弹到多个内核。 结果:
所以不是硬盘驱动器、RAM 或缓存,而是 CPU 才是瓶颈。
**谢谢大家! ** 为您提供帮助
================================================ ==========================
我的机器:Intel i7-4710MQ @ 2.5GHz,16GB RAM
【问题讨论】:
-
编译 CPU 不绑定吗?
-
@BaummitAugen 如果为真,我的 CPU 将始终接近 100%,但事实并非如此。
-
每次构建都需要重新制作所有内容吗?听起来有机会通过管理依赖关系来减少需要完成的工作量。
-
如果禁用并行构建,CPU 将不会接近 100%。一个核心将是。如果您还没有使用预编译头文件,那么它们可以极大地提高构建速度。
-
推测:
.NOPARALLEL的存在可能是因为Makefile没有正确捕获所有依赖项,并且它们无法让并行构建正常工作。你试过删除.NOPARALLEL吗?
标签: c++ windows performance makefile