【发布时间】:2015-05-09 06:26:01
【问题描述】:
我有一些需要大量编译的 cpp 文件。它们包含一些基本的类/代码,以及一些模板,但没有任何东西可以证明编译时间大约为几十秒。
我确实使用了几个外部库(boost/opencv)
这就是 gcc 关于编译时间的说法。如何找到导致编译时间过长的库/包含/函数调用?
Execution times (seconds)
phase setup : 0.00 ( 0%) usr 0.00 ( 0%) sys 0.01 ( 0%) wall 1445 kB ( 0%) ggc
phase parsing : 6.69 (46%) usr 1.61 (60%) sys 12.14 (47%) wall 488430 kB (66%) ggc
phase lang. deferred : 1.59 (11%) usr 0.36 (13%) sys 3.83 (15%) wall 92964 kB (13%) ggc
phase opt and generate : 6.25 (43%) usr 0.72 (27%) sys 10.09 (39%) wall 152799 kB (21%) ggc
|name lookup : 1.05 ( 7%) usr 0.28 (10%) sys 2.01 ( 8%) wall 52063 kB ( 7%) ggc
|overload resolution : 0.83 ( 6%) usr 0.18 ( 7%) sys 1.48 ( 6%) wall 42377 kB ( 6%) ggc
...
Profiling the C++ compilation process 处理识别慢速文件,但我需要更细粒度的信息才能找到罪魁祸首
(其他文件/项目编译都是毫秒/秒,所以不是电脑资源的问题,我用的是gcc 4.9.1)
【问题讨论】:
-
使用
#if 0对文件进行二进制搜索?即,不要编译后半部分。如果现在很快,请不要编译后半部分。如果相反仍然很慢,请不要编译后面的 3/4。如果您的代码有 1024 个函数(!),则问题在 10 次迭代中解决(如果您的文件有 1024 个函数,则可能文件大小有问题)。 -
@Yakk:可能没那么容易。没有字体一半,后半部分可能无法编译。此外,如果代码确实大量使用模板,那么长时间可能是由于两部分之间的交互。
-
@rodrigo 是的,就是这么简单:看来您将不同的算法投射到我的描述中。我只建议编译文件的前缀——你可能会得到链接器错误,但不会出现编译器错误。最先引起交互而导致编译器时间变长的代码段将是找到的代码段(“边缘”代码段,包含它会使时间变长,而删除它会保持合理的时间)。当然,它并不能解决问题来自于大和小,或小和大的问题,但无论如何这种情况往往比较少。
-
导致爆炸的边缘代码可能不是“应归咎于”的代码,而是触发问题的代码。可能需要对其进行自省。
-
如果我是你,我会开始
#if 0Boost 相关的部分。当然,它们可能是“无辜的”,但根据我的经验,Boost 库通常非常依赖 TMP,这可能会导致编译时间变慢。
标签: c++ performance gcc boost compilation