jjzjj

c++ - 从 RAM 驱动器构建真的会提高速度吗?

coder 2024-06-09 原文

我正在处理一个项目,该项目包含数千个 .cpp 文件以及数千个 .h.hpp 并且构建需要28 分钟 从 SSD 运行。

我们几周前从另一家公司继承了这个项目,但仔细阅读了 makefile,他们通过 .NOPARALLEL 虚假目标明确禁用了并行构建;我们正试图找出他们是否有充分的理由。

最坏的情况下,唯一加快速度的方法是使用 RAM 驱动器。

所以我按照 Tekrevue 中的说明进行操作并安装了Imdisk然后使用 CrystalDiskMark 运行基准测试:

固态硬盘 RAM 驱动器

我还使用 Cygwin 运行了 dd,与我的 SSD 相比,RAM 驱动器有显着的加速(至少 3 倍)。

但是,我的构建时间一分钟都没变!

然后我想:也许我的专有编译器调用了一些 Windows API 并导致速度大幅下降,所以我从 Cygwin 上的源代码构建了 fftw

我期望的是我的处理器使用率会增加到某个最大值并在构建期间保持在那里。相反,我的用法非常尖锐:每个编译文件一个。我知道即使是 Cygwin 仍然必须与 Windows 交互,所以我仍然有尖锐的 proc 使用率这一事实让我假设这不是我的编译器的问题。

好的。新理论:为每个源文件调用编译器在 Windows 中有一些巨大的开销,因此,我从我的构建日志中复制粘贴并将 45 个文件传递给我的编译器,并将其与单独调用编译器 45 次进行比较。调用 ONCE 速度更快,但 45 个文件总共只用了 4 秒。 我看到了与为每个文件调用一次编译器时相同的“尖峰”处理器使用情况。

为什么即使从 RAM 驱动器运行时我也不能让编译器运行得更快?开销是多少?

更新 #1 评论者一直在说,我认为,RAM 驱动器是不必要的,因为 Windows 无论如何都会在 RAM 中缓存输入和输出文件。 另外,也许 RAM 驱动器实现(即驱动程序)不是最佳的。 所以,我不再使用 RAM 驱动器了。

此外,人们还说我应该多次运行 45 个文件的构建,以消除缓存开销:我运行了 4 次,每次都是 52 秒

CPU 使用率(编译结束前 5 秒)

虚拟内存使用 当编译器将内容吐出到磁盘时,它实际上首先缓存在 RAM 中,对吗? 那么这个屏幕截图表明 IO 不是问题,或者更确切地说,它和我的 RAM 一样快。

问题: 那么既然一切都在 RAM 中,为什么 CPU % 不是更多的时间呢? 我可以做些什么来加快单线程/作业构建速度? (记住这是目前的单线程构建)

更新 2 下面建议我应该将我的 compile-45-files 调用的亲和性设置为 1,这样 Windows 就不会在对多个内核的调用周围反弹。 结果:

100% 单核使用率!同样的 52 秒

所以瓶颈不是硬盘驱动器、RAM 或缓存​​,而是 CPU。

**谢谢大家! ** 为了你的帮助

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

我的机器:Intel i7-4710MQ @ 2.5GHz,16GB RAM

最佳答案

我不明白你为什么要如此指责操作系统,除了顺序的、愚蠢的 IO(加载源/保存中间输出——应该通过看到 SSD 和 ramdisk 执行相同来排除)和进程启动(通过编译单个巨型文件排除)编译器和操作系统之间的交互非常少。

现在,一旦你排除了“磁盘”和处理器,我预计瓶颈是内存速度 - 不是 RAM-磁盘 IO 部分(可能已经大部分被 SSD 饱和),而是编译过程本身。

这实际上是一个相当普遍的问题,此时处理器通常比内存更快,这通常是瓶颈(这就是为什么目前编写缓存友好代码至关重要的原因)。处理器可能浪费了一些重要的时间来等待从主内存中获取缓存数据。

无论如何,这都是猜测。如果你想要一个可靠的答案,像往常一样你必须分析。从 a list like this 获取一些采样分析器然后去看看编译器在哪里浪费时间。就我个人而言,我希望看到正常剂量的缓存未命中(如果您为 ramdisk 烧毁了太多 RAM,甚至会出现页面错误),但任何事情都可能发生。

关于c++ - 从 RAM 驱动器构建真的会提高速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37262939/

有关c++ - 从 RAM 驱动器构建真的会提高速度吗?的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  3. ruby - 在 Ruby 中构建长字符串的简洁方法 - 2

    在编写Ruby(客户端脚本)时,我看到了三种构建更长字符串的方法,包括行尾,所有这些对我来说“闻起来”有点难看。有没有更干净、更好的方法?变量递增。ifrender_quote?quote="NowthatthereistheTec-9,acrappyspraygunfromSouthMiami."quote+="ThisgunisadvertisedasthemostpopularguninAmericancrime.Doyoubelievethatshit?"quote+="Itactuallysaysthatinthelittlebookthatcomeswithit:themo

  4. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  5. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  6. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  7. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  8. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  9. ruby-on-rails - 我真的需要在 Rails 中使用 csv gem 吗? - 2

    我的问题很简单:我是否必须在使用RubyonRails的类上require'csv'?如果我打开一个railsconsole并尝试使用CSVgem它可以工作,但我必须在文件中这样做吗? 最佳答案 CSVlibrary是ruby​​标准库的一部分;它不是gem(即第三方库)。与所有标准库(与核心库不同)一样,csv不会由ruby​​解释器自动加载。所以是的,在您的应用程序中某处您确实需要要求它:irb(main):001:0>CSVNameError:uninitializedconstantCSVfrom(irb):1from/Us

  10. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

随机推荐