当前位置:首页 > 公众号精选 > CPP开发者
[导读]随着C项目的持续扩大,编译效率越来越是一个问题了。想一想你每天花在这上面的时间,再乘以团队成员的个数,是不是成本很高?那有没有什么办法,在不需要修改源码,也不更换硬件的情况下提升效率呢?一起来看看下面这几个方法,足以让你的编译速度飞起来。先随便下载一个第三方源码,例如:spdlo...

随着 C 项目的持续扩大,编译效率越来越是一个问题了。想一想你每天花在这上面的时间,再乘以团队成员的个数,是不是成本很高?


那有没有什么办法,在不需要修改源码,也不更换硬件的情况下提升效率呢?一起来看看下面这几个方法,足以让你的编译速度飞起来。


先随便下载一个第三方源码,例如:spdlog,我们来测试一下整个编译需要多久:



源码很少,但却用了 00:48,速度着实不给力,来优化一下吧!



1

启用多核编译


可以开启多核编译来提高编译速度,充分利用机器的性能来优化编译。


打开 Qt Creator,选择【Kits】->【构建套件(kit)】,在【Environment】处输入“MAKEFLAGS=-j16”


这是最便利的方式,一劳永逸,只需设置一次,后期所有使用 make 的构建系统都会自动启用。



这里的数字大小,需根据电脑的 CPU 核心数和线程数来设置,假如是 8 核 16 线程,建议设置 16。



qmake 设置


如果只想应用于某个特定项目,选择【项目】->【构建步骤】->【Make】,点击右侧的【详情】按钮,在【Parallel jobs】或者【Make arguments】处设置并行工作线程的个数,这两个效果是一样的:




cmake 设置


和 qmake 类似,只不过 cmake 的设置在【Tool arguments】处:




效果


设置完成之后,重新编译一下:



优化到了 00:10,怎么样,提升了不少吧。



2

使用 ccache 编译器缓存


ccache(全称:compiler cache)是一个编译器缓存,该工具会高速缓存编译生成的信息,并在编译的特定部分使用高速缓存的信息,比如头文件,这样就节省了通常使用 cpp 解析这些信息所需要的时间。


  • ccache 主页:https://ccache.dev/

  • 文档地址:https://ccache.dev/documentation.html

  • GitHub 源码:https://github.com/ccache/ccache



安装 ccache


要安装 ccache,执行以下命令:


$ sudo apt install ccache  


qmake 设置


打开 .pro,添加以下配置,ccache 就可以工作了:


QMAKE_CXX = ccache $$QMAKE_CXX 

从 Qt 5.9 开始,有一个更简单的方式:


load(ccache)


cmake 配置


在 CMakeLists.txt 中添加以下配置,将 ccache 作为编译命令和链接命令的启动器:


find_program(CCACHE_FOUND ccache)
if(CCACHE_FOUND)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
endif(CCACHE_FOUND)


效果


配置完成之后,再来测试一下:



简直吊炸天 - 00:01,从最初的 48 秒优化到了仅需 1 秒,效率提升了快 50 倍,这速度 6 的飞起!


- EOF -

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

KeilμVision4是Keil软件公司为8051系列微控制器及其兼容产品设计的集成式软件开发环境。μVision4集成了C51编译器和A51汇编器,其界面类似于Microsoft VS,支持C语言和汇编语言程序的编写...

关键字: 程序 编译 链接

第五届中国国际进口博览会,丹纳赫集团携手中国健康传媒集团,在创新技术在疫苗、细胞治疗药物、中药研发以及质量控制中的应用等领域签署战略合作。同时,双方将共同编译并出版《生物制药工艺》等书籍,以支持相关领域国际前沿技术工具在...

关键字: 编译 质量控制

(全球TMT2022年9月27日讯)新思科技近日宣布推出业内首款基于其ZeBu® EP1硬件仿真系统的硬件仿真与原型验证统一硬件系统,致力为SoC验证和前期软件开发提供更高水平的性能和灵活性。新思科技ZeBu...

关键字: 硬件仿真 新思科技 硬件系统 编译

3个SystemVerilog新特性!01`begin_keyword`end_keyword硬件描述语言中有很多特殊的编译或者综合等工具的预执行指令,在某些场景下我们可以利用一下HDL之外的语法去指导工具,而不是信马由...

关键字: SYSTEMVERILOG DEFINE PACKAGE 编译

你知道,为什么在C中使用了pow函数不需要链接libm库吗?什么情况需要指定链接库?在解释之前,先回顾一下。//来源:公众号【编程珠玑】//https://www.yanbinghu.com#include#includ...

关键字: 编译 POW IBM TEST

    关注、星标公众号,直达精彩内容作者:hguisu一、地址概念和程序如何运行在多道程序环境下,要使程序运行,必须先为之创建进程。而创建进程的第一件事,便是将程序和数据装入内存。如何将一个用户源程序变为一个可在内存中...

关键字: 编译

作 者:道哥,10年嵌入式开发老兵,专注于:C/C、嵌入式、Linux。关注下方公众号,回复【书籍】,获取Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章(PDF格式)。目录学习的困惑实践环境编译进内核编...

关键字: 内核 编译 驱动程序

不知道各位小伙伴是否碰到过这样的情况:一个.c文件include另一个.h头文件,使用Makefile来构建(编译)应用程序。第一次编译、执行,很正常!但是此时,如果修改了.h头文件,再次编译时,就出现问题了:预期的执行...

关键字: 编译

一、前言老周这里编译Kafka的版本是2.7,为啥采用这个版本来搭建源码的阅读环境呢?因为该版本相对来说比较新。而我为啥不用2.7后的版本呢?比如2.8,这是因为去掉了ZooKeeper,还不太稳定,生产环境也不太建议使...

关键字: 源码 编译

道哥的第030篇原创一、一个真实的代码泄漏故事二、Jenkins的基本使用三、gitsubmodule基本使用四、在Jenkins中使用gitmodule来编译所有的模块五、总结六、资源下载一、一个真实的小故事事情发生在...

关键字: 自动化 编译 代码
关闭
关闭