【问题标题】:How to deliberately slow down compilation?如何故意减慢编译速度?
【发布时间】:2019-06-10 14:15:48
【问题描述】:

有很多问题询问如何加快 C++ 代码的编译速度。我需要做相反的事情。

我正在使用一个监控编译器调用的软件来进行静态代码分析。但如果编译器进程关闭得太快,监控软件可能会错过它。所以我需要减慢编译速度。我知道这是一个糟糕的解决方案,希望它只是暂时的。

我想出了两个解决方案:

  • 禁用并行构建,启用预处理器和编译器列表生成。它可以工作,但需要大量的鼠标点击
  • 使用编译器选项强制包含以某种方式减慢编译速度的特殊头文件。

不幸的是,我无法同时想出一些简单的编写和难以编译的东西。大量使用#warning 似乎有效,但显然会使输出明显混乱。

我使用 Keil 和 armcc 编译器,所以我可以使用大部分 C++11,但最大模板递归深度仅为 63。

最好不要对二进制大小或运行时间产生任何开销。

UPD:我会试着澄清一下。 我知道这是一个可怕的想法,我知道这个问题应该以不同的方式解决。我会尝试以不同的方式解决它,但我也想探索这种可能性。

【问题讨论】:

  • 你总是可以在编译器中抛出一些表达式模板。这些可能会迅速膨胀,导致编译需要很长时间。
  • 如果这个监视编译器的软件是你发明的,那么只需将编译命令替换为首先调用编译器然后指示编译器被调用并完成的命令。例如,它可以写入日志消息或发送网络消息。然后寻找那个指示而不是寻找编译器进程。
  • @Amomum,这是 XY 问题的缩影。减慢编译速度是触发静态分析的一种糟糕方法,而且很可能无法完全或可靠地工作。如果您想要静态分析,那么要么将其直接集成到构建系统中,要么将其设置为单独的关注点。
  • 在 Unix/Linux 下,我可能会在一个实际上是命名管道的文件上尝试#include,而另一端的发送进程会在几秒钟内将标头内容滴出。
  • 您似乎问错了问题。如果您的问题严格来说是“在不产生二进制输出的情况下编译什么 C++ 代码需要很长时间”,好的。但这似乎不是您需要或想要的。你真正想要的是一个通知编译器调用的解决方案(被否决)。

标签: c++ c optimization compilation


【解决方案1】:

也许这个解决方案会足够慢 =),就像@NathanOliver 提议的那样。 它的编译时间表正弦我使用。它需要额外的空间,但你可以稍微调整一下(表格大小和正弦精度是“staticSinus”函数的模板参数,希望你能找到最好的)。 https://godbolt.org/z/DYZDF5

【讨论】:

  • 谢谢,看来效果不错。我什至可以通过更改表格大小和正弦精度来调整减速:) 唯一的缺点是它占用了大量空间,但这并不是很重要,我实际上不需要链接它。
【解决方案2】:

你不想做任何事情。以下是一些不同程度的笨拙的解决方案:

  1. 理想的解决方案:从 Makefile 调用代码分析

  2. 将编译器替换为例如将命令行转发给编译器的 Python 脚本,然后触发分析工具。

  3. Monitor make 而不是编译器 - 它的寿命往往更长。

  4. 有一个小型包装脚本在共享内存中维护一个引用计数,当引用计数最初递增时,包装器应该在编译器完成后进入休眠“足够长的时间”。 监控该脚本。

简而言之:监控工具不应该监控任何东西。应从构建工具调用代码分析,即在Makefile 中给出。如果手动生成Makefile 太麻烦,请使用cmakeninja,或使用不依赖的xmake。您还可以生成 IDE 所需的任何“项目”文件,以便更轻松地处理项目。但是,让 Keil 特有的东西成为项目的真实来源:从那时起,一切都会变得简单。

【讨论】:

  • 您的回答听起来很合理,但需要我做很多工作。首先要做的事情-我不使用make。第二 - 我无法对单个文件触发分析,分析工具需要编译器标志和预处理文件。监视编译器调用是唯一可用的“开箱即用”方式。从理论上讲,我可以为分析工具创建中间文件,但根本没有记录。所以我想要一个简单的临时解决方案,而分析工具的维护人员将正确集成到我的 IDE。
  • @Amomum,你为什么不能用将所有命令行选项转储到文件中的包装脚本替换编译器二进制文件?
  • @Amomum 然后将编译器包装在 5 行 Python 脚本中并在第一个(或最后一个!)编译器调用上休眠是您的解决方案 :)
  • @KubaOber 监控软件不受我控制;我只能猜测它会寻找具有特定名称的进程。制作一个只让python进程休眠的脚本,然后以与以前相同的速度调用编译器有什么好处?
  • @SK-logic 因为我不想弄乱静态分析工具文件格式。减慢编译速度是技术人员的实际建议。支持:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多