有关编译巨大代码生成的源文件的任何技巧?

我正在尝试编译来自大型Dymola模型的C代码。生成的代码与人类编写的代码不同,存在许多展开的循环,大量使用的宏,手动索引的巨大数组,最重要的是源文件很大(> 1e6行)。

使用O2O3编译这些源文件时,我的编译时间变得非常高:每个文件 10-30分钟。 Clang和GCC都有。我不能很好地遵循生成的汇编代码,因此我不确定优化的质量。通过不生成调试信息或关闭警告可以减少编译时间,但是与关闭优化相比,这些警告很小。在运行时方面,O0O2之间有明显的区别,因此我不能证明这样做是合理的。使用-ftime-trace进行编译时,我可以看到Clang前端占90%的时间是> htop指出,该进程没有受到内存瓶颈的困扰,它似乎完全受CPU限制。

是否可以进行一些预处理以改善编译时间?将源文件分成较小的块会提高性能,为什么?编译器是否设计为可以处理这些巨大的源文件?我还应该知道其他编译选项吗?

令人惊讶的是,带有/O2的Windows上的MSVC花费的时间只是Clang和GCC的一小部分。

编译器参数示例:clang -m64 -Wno-everything -c -D_GNU_SOURCE -DMATLAB_MEX_FILE -ftime-report -dfmI2_FUNCTION_PREFIX=F2_Simulations_SteadyState_SteadyState2019MPU_ -DRT -I/opt/matlab/r2017b/extern/include -I/opt/matlab/r2017b/simulink/include -I/mnt/vagrant_shared/<path>/Source -I/mnt/vagrant_shared/<path>/export -fexceptions -fPIC -fno-omit-frame-pointer -pthread -O0 -DNDEBUG -std=c99 /mnt/vagrant_shared/<path>/some_file.c -o /mnt/vagrant_shared/<path>/some_obj.obj

平台:在虚拟机VM上运行的CentOS 7。 Clang 7,GCC 4.8(由于其他要求,我坚持使用这些旧版本)。

piggyjj 回答:有关编译巨大代码生成的源文件的任何技巧?

按照@AProgrammer的建议,将-O2替换为所包含的优化的一部分,从而可以显着提高编译时,而运行时差异可以忽略不计。

具体地说,我已排除

-fcode-hoisting -fdevirtualize-speculatively -fexpensive-optimizations -fipa-bit-cp -fipa-icf -fipa-ra -fipa-vrp -fisolate-erroneous-paths-dereference -flra-remat -freorder-blocks-algorithm=stc -fstore-merging -fipa-reference -fipa-reference-addressable -fshrink-wrap-separate -fssa-backprop -fssa-phiopt

其中某些仅以某种方式仅适用于C ++。生成的编译速度快约3倍。 -O3中可能还包含其他选项,而编译时代价却很小。


其他人则建议GCC和Dymola都建议-O1作为在编译时性能和运行时性能之间的良好折衷。在-f之上使用一些额外的-O1选项将是一个很好的方法,可以防止各种GCC选项的效果/收益发生变化。

另外,如预期的那样,通过将源文件分成更小的块,总编译时间(编译和链接)变得更糟。

本文链接:https://www.f2er.com/3032881.html

大家都在问