编译加速

  1. 工具
    1. 编译时间统计
    2. nm
  2. 全量编译
  3. 增量编译
  4. 链接加速

工具

编译时间统计

# 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 弱未定义符号

全量编译

  1. 减少非必须要的编译项目
    1. 单元测试类
  2. unitybuild减少编译单元(核心是减少头文件的重复编译)
    1. 将多个cpp合并编译. 减少重复头文件的耗时
  3. 使用预编译头减少编译单元的耗时(核心是减少头文件的重复编译)
    1. 将耗时常用且不经常修改的加入到其中
  4. proto
    1. 避免协议文件被头文件引用, 采用前置声明+定义和实现分离的方式, 将协议头文件放到cpp文件中.
    2. 避免超大proto文件, 根据使用范围和频率进行分割, 减少proto变更影响的范围.
    3. 自动生成的proto是重灾区, 这些proto代码一个比一个量大.

增量编译

CMake相关

  1. 优化CMake等脚本, 不每次全量生成新文件, 而是配置依赖变更后才生成, 减少非必要的变更.

枚举解耦未实操

  1. 减少枚举文件变更导致的重编, 提供STR到INT的映射
    1. 开发期做这种替换
    2. 发布期换回正常方式

链接加速

mold

更好的链接算法和使用多线程链接

使用之前

 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