记一次提高依赖PCL的C++代码编译速度的经历

最近调试S-Fast-LIO算法,包含PCL的C++ Lidar SLAM算法,编译时间总是很长难以忍受。
花了小半天,探究了下方法,并做总结。

1. Debug模式和Release模式,优化等级的影响

SET(CMAKE_BUILD_TYPE "Debug")	// Release
set( CMAKE_CXX_FLAGS "-std=c++14 -O3" )		// -O3,最优化;-O0,不进行任何优化;-O1,默认,均衡优化

在代码中只修改一行,重新编译:
Debug模式,-O3优化:用时1m20s
Debug模式,-O0优化:用时1m19s(没有显著变化)
Release模式,-O0优化:50s
因此,Release模式会大大减少编译时间。

2. 使用ccache:

sudo apt install ccache

据说ccache可以在部分文件未修改的情况下提高编译速度,以空间换取时间。但我实际测试的时候,发现对于工程并不是很大、每次编译文件基本只有那么几个的,并不是非常友好。
只有当编译过这个代码,修改以后,再修改回来,会有显著的提升,但只要是有那么一丢丢的不一样,就白干。
Debug模式, -O3优化,使用ccache:
第一次编译:1 min 11s
修改1行后编译: 1min 5s
退回这次修改再编译:10.9s

3. PCL官方给出的一些注意事项

Building time of a project which depends on PCL is too long

建议:

  1. 如无必要,不要添加用不到的头文件;
  2. 多线程编译:make -jxxx
  3. 使用最新版的PCL可能做了优化
  4. 拆分多个文件,方便修改后编译更快

4. 使用 include-what-you-use 精简头文件

整理混乱的头文件,我用include what you use

安装

  • 从源码编译clang(编译很久,过程中容易爆内存,用-j1指令):
  • 安装 nuxxx,这个被IWYU依赖;
sudo apt-get install libncurses5-dev libncursesw5-dev
  • 安装IWYU:

装了半天然后放弃了……编译太麻烦了,也担心把自己的系统环境搞崩,所以没有继续。

5. 分离头文件和cpp部分

由于s-fast-lio写的一言难尽,.hpp文件中包含了函数的实现,而其他文件包含该头文件时等有由包含了一次这些实现部分,因此每次修改.hpp的实现部分,都会把所有代码都编译一遍。
因此,将头文件中除了函数声明(和小的inline函数)外,全部实现放到对应的cpp文件中。重新分离出来了两个.cpp文件。此时编译时间:
修改cpp中的一样:24s
时间大大减少。

归根到底,还是官方给出的建议4:拆分多个文件,这个方式解决的问题。