【问题标题】:How do I find out where the compiler spends its time?我如何找出编译器花费时间的地方?
【发布时间】:2013-03-02 14:43:00
【问题描述】:

我如何找出编译器在哪里花费时间?

我的构建太慢了,我已经为 VC++ 临时文件使用了 RAMdisk,但它没有任何区别。 (我有一个 SSD,所以我预计没有区别。)

此项目中的大多数单个 C++ 文件大约需要 10 分钟。 2 秒编译,这看起来很糟糕(因为我也没有任何项目内并行化,因为我使用的是 VS2005)。

我该如何优化呢?不进行分析就不要优化,但是如何分析编译器?

注意:这些并没有真正的帮助:


让我们添加一个很好的评论:你有很多模板吗?您的文件平均有多大?你检查过只包含最少的必要标题

不,我没有。我当然可以(并且pro'lly会)。我也许能找到一些东西,但这都是推测反复试验

“Everybody”告诉你,你应该只在测量/分析之后进行优化,但是在优化编译时间时,我们又回到了试错?


注意:__TIME__ 的 cmets 提出的“hack”确实有效,至少在 Visual-C++ 上无效,因为(如the docs 状态):当前源文件的最近编译时间。时间是 hh:mm:ss 形式的字符串文字。——我想至少可以用这个标记获得单个编译单元的计时,但它无助于深入研究一个编译单元.

【问题讨论】:

  • 你有很多模板吗?您的文件平均有多大?你检查过只包含最少的必要标题吗?
  • 你使用的是预编译头文件吗?
  • @MartinBa 使用“仅包括必要的最少标头”,这不是尝试和错误,而是一种很好的做法。关于文件的平均大小:编译器需要解析整个内容,因此文件大小显然存在性能限制。我建议使用增量构建系统,其中只重新编译更改的文件。那你真的不用担心编译时间长了。
  • 您可以尝试将#pragma message( "Starting " __TIME__ )#pragma message( "Completed " __TIME__ ) 之类的东西放在您怀疑编译需要一段时间的地方 - 例如你有很多繁重的模板实例化
  • 它不会让您直接回答“编译器在哪里花费时间?”,但查看预处理器输出可能会让您更好地了解“编译器尝试了多少工作”做什么?':stackoverflow.com/questions/277258/…

标签: c++ visual-c++ compiler-construction profiling build-time


【解决方案1】:

SysInternals ProcMon 将向您显示所选进程完成的所有 I/O,包括发生时的时间戳和完整路径。

【讨论】:

  • 嗯 ... 用 VC++ 完成这件事似乎很棘手......我有devenv.exe,但这会产生cl.exe(我认为是通过一些中介)。你有没有在 VS 版本上尝试过这个?
  • Process Monitor 有非常灵活的过滤器。您可以设置与流程可执行文件匹配的过滤器。您不需要使用正在运行的进程的PID。
【解决方案2】:

有几种方法可以优化编译时间:

  • 使用预编译头文件。如果您使用 Visual C++,则使用“stdafx.h”。默认情况下,“stdafx.h”设置为预编译头文件,但我建议您检查以确保它是。

  • 使用 Linux :)。如果您不必使用 Windows 来完成您的工作,我建议您使用 Linux。它的编译时间要好得多。一些原因是: ext4 平均比 NTFS 快约 40%,并且它具有更好的进程调度程序。在处理器操作方面,Linux 通常会以大约 x1.8 - x2 倍的速度运行,并且编译取决于处理器。

  • 使用另一个编译器。众所周知,Clang/LLVM 具有更好的编译速度,并且还支持预编译头文件。

【讨论】:

  • 如果您使用 Visual C++ 而不是使用“stdafx.h”,请将所有标题放入其中。 - 多么糟糕的建议。 所有标头肯定不是想要放入stdafx.h的(是的,我将它用于选定的常见标头)
  • MS 当然不推荐这个。 所有标题?请提供参考。
  • 好吧,即使你把所有的标题都放在那里也不是什么大问题。 PCH 的全部原因是pre-编译,所以无论如何你只需支付一次成本。但实际上,它应该只包含大的、经常使用且很少更改的标题。
  • @Joey +1 - 这就是我的意思。
【解决方案3】:

TL;DR:使用 MS vcperf 分析您的构建。

注意:这个问题来自 2013 年,工具来自 2019 年,所以,是的,这里有一些等待。 :-)

MS 发布了vcperf,它建立在C++ Build Insights 的基础上,基本上是一个工具链,允许您分析编译过程

https://devblogs.microsoft.com/cppblog/introducing-c-build-insights/

C++ Build Insights 使用 vcperf,该工具可让您捕获构建跟踪并在 Windows Performance Analyzer (WPA) 中查看它。

【讨论】:

    猜你喜欢
    • 2011-05-08
    • 1970-01-01
    • 2011-07-05
    • 2011-09-03
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2020-06-05
    相关资源
    最近更新 更多