TIL:Gentoo(的一个用户?)推荐每个-j有一个cpu内核和2G内存,所以比如在16核16G内存的平台上应该-j8。https://wiki.gentoo.org/wiki/User:Pietinger/Tutorials/Optimize_compile_times
@w3cing 我没有研究过linker。听你的描述是lld/gold会同时link好几个程序是么?这样为什么不好啊?
@alvis 不是,是Makefile不区分link和compile,如果用make -j8的话make只知道要同时跑八个命令,并不管这些命令究竟是做什么的。但是link需要更多内存,compile需要更多cpu;声明make -j参数的时候一般会按照compile的需求来,这样做一般没有问题,因为通常link只在最后执行一次。但是有的项目会生成多个executable,也就需要link很多次,make -j8最糟糕的情况下就会同时link八个executable,内存就不够用了。
所以最好是compile的时候-j8,但是最后link的时候-j1。这样做的问题是-j1可能会导致cpu/内存闲置,所以我想至少用个能充分利用cpu的linker实现,这样顶多只是内存没有被充分利用……
@w3cing 原来如此,谢谢解答。我看另一个评论说用ninja。我编译LLVM时用的就是ninja,最后仍然要卡在链接上。我觉得LLVM就是太大了,不知道从make换到ninja会不会真的加速
@alvis 就是一次只link一个程序,但是linker自己运行的时候会充分利用所有的cpu core。mold应该就比较符合这个条件。