工具
编译时间统计
# g++.sh
real_compiler="/usr/bin/g++"
filename=$(echo $* | grep -o "\ -c .*")
output="/root/stat.log"
/usr/bin/time -f "%U-%S $filename" -a -o $output $real_compiler $*
# $
export CXX=g++.sh
mkdir b2 && cd b2 && cmake .. -DCMAKE_BUILD_TYPE=debug && make -j24 BigWorldServer
nm
nm a.cpp.o | awk 'NF>=2 {print $(NF-1)}' | sort | uniq -c
15 b bss段
2506 n debug符号
2394 r rodate段
36 t text段
1 T global text?
71 u unique global symbol
448 U 未定义符号, 链接阶段会去寻找
426 V 弱符号
4 w
11854 W 弱未定义符号
全量编译
- 减少非必须要的编译项目
- 单元测试类
- unitybuild减少编译单元(核心是减少头文件的重复编译)
- 将多个cpp合并编译. 减少重复头文件的耗时
- 使用预编译头减少编译单元的耗时(核心是减少头文件的重复编译)
- 将耗时常用且不经常修改的加入到其中
- proto
- 避免协议文件被头文件引用, 采用前置声明+定义和实现分离的方式, 将协议头文件放到cpp文件中.
- 避免超大proto文件, 根据使用范围和频率进行分割, 减少proto变更影响的范围.
- 自动生成的proto是重灾区, 这些proto代码一个比一个量大.
增量编译
CMake相关
- 优化CMake等脚本, 不每次全量生成新文件, 而是配置依赖变更后才生成, 减少非必要的变更.
枚举解耦未实操
- 减少枚举文件变更导致的重编, 提供STR到INT的映射
- 开发期做这种替换
- 发布期换回正常方式
链接加速
更好的链接算法和使用多线程链接
使用之前
Performance counter stats for 'make BigWorldServer':
29,993.61 msec task-clock # 0.999 CPUs utilized
148 context-switches # 0.005 K/sec
26 cpu-migrations # 0.001 K/sec
777,595 page-faults # 0.026 M/sec
<not supported> cycles
<not supported> instructions
<not supported> branches
<not supported> branch-misses
30.008942931 seconds time elapsed
27.920985000 seconds user
2.075018000 seconds sys