TIL:Gentoo(的一个用户?)推荐每个-j有一个cpu内核和2G内存,所以比如在16核16G内存的平台上应该-j8。wiki.gentoo.org/wiki/User:Piet

感觉需要一个编译期并行但最后链接时用mold一个一个多线程链接的系统,专治LLVM这种编译一半卡在链接上的项目。

关注

@w3cing 什么叫一个一个多线程?

@alvis 就是一次只link一个程序,但是linker自己运行的时候会充分利用所有的cpu core。mold应该就比较符合这个条件。

@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会不会真的加速

登录以加入对话
Monado

Monado 是一个以任天堂为主、面向全平台游戏的、非营利性的中文向社区。在这里,你可以畅所欲言一切和游戏有关的东西,包括但不限于游戏日常、心得、感想、同人等;当然,吐槽自己的生活也完全没有问题。请在遵守所在国家或者地区法律法规的前提下自由的使用。