如何提高工程编译速度-程序员宅基地

技术标签: python  java  ubuntu  linux  大数据  

点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,麻烦点个在看或点个赞,感谢~       文章首发  公众号—— Pou光明

公众号还在维护,大家莫慌~

Linux Qt 平台为例测试

编译总量 = 编译速度 * 编译时间

 

按照上面等式进行优化,则:

在编译总量不变的前提下,要减少编译时间,则可提升编译速度;

或在编译速度不变的情况下,较少编译总量;

再或者既减少编译总量又提高编译速度。

C/C++编译特点

C/C++ 编译单位是文件,无法进行跨模块优化,C++20可支持。

将.o文件链接在一起时很难并行。

预处理过程可并行进行。

提高编译速度

1 减小编译总量

包含大量头文件会导致预处理时间变长,针对此尽量使用前置声明。

Pimpl(Private Implementation)模式与不透明指针。

高内聚、低耦合,减少模块间的依赖。

删除不必要的头文件。

2 提高编译速度

在提升编译速度上,可以增加编译机器数量或者提高单机编译能力。针对整体工程。

2.1 提高单机编译能力

多核编译

make -j*

 

#减少重复编译相同代码的时间

ccache  

 

解决IO瓶颈,充分利用内存资源,头文件非常多,预处理时需要反复从磁盘读取文件

tmpfs 

2.2 使用多机进行

distcc :分布式编译,利用多台计算机资源共同编译一个程序,

   可用于内核或者大型程序(**未做测试**),简单讲链接过程在主机进行。

icecc : distcc升级版

Qt多核编译与ccache使用具体操作流程

1  Qt 设置多核编译

Qt侧边栏 Projects -> Build -> Build Steps

注意虚拟机配置核数。

 

2  ccache 安装及配置步骤

2.1 ccache安装

sudo apt-get install ccache   

ccache -V 可查看是否安装成功

安装完成后默认缓存路径为~/.ccache ,默认缓存空间配置为5G

 

2.2 Qt中配置ccache

#Qt pro中添加  

equals(COMPILE,2){

QMAKE_CXX = ccache g++

}

 

需在Qt->Projects->Build Steps->Additionals arguments 配置变量,如图 

注:使用软链接、配置环境变量等方式无法完成Qt自动使用ccache,qmake生成的Makefile中未使用ccache.

 

Qt使用分布式编译icecc具体操作流程

1 Qt 设置多核编译,设置如上

2.1 1icecc 及gui工具安装

 

sudo apt-get install icecc

sudo apt install icecc-monitor#在终端使用icemon命令进行查看

#开机后icecc-scheduler(调度器)可自动启动,如未启动,可使用systemctl start icecc-scheduler命令启动

 

一个调度器,两个编译机图示。

2.2 icecc 相关设置

如果在ui工具中无法搜索到调度机与客户机,可使用下面命令查看防火墙状态。如果状态为inactive,则无需进行其他设置。

sudo ufw status# Status: inactive

 

如果状态为active,则需添加相关端口。

sudo ufw allow 10245/tcp #添加TCP/10245端口

TCP/10245 on the daemon computers (required)

TCP/8765 for the the scheduler computer (required)

TCP/8766 for the telnet interface to the scheduler (optional)

UDP/8765 for broadcast to find the scheduler (optional)

 

3 Qt中使用icecc

#Qt pro中添加

equals(COMPILE,2){

QMAKE_CXX = icecc g++

}

 

Qt使用icecc及ccache

Qt pro中添加  

equals(COMPILE,2){

QMAKE_CXX = icecc ccache g++

}

 

icecc不同电脑间组成局域网

1 虚拟机开发环境相关设置(VMWare为例)

1.1 查看windows无线网卡

ipconfig /all

无线局域网适配器 描述 如 Intel(R) Wi-Fi 6 AX200 160MHz

1.2 设置VMWare Vmnet信息

编辑->虚拟网络编辑器->更改设置->设置桥接模式->已桥接至选择第一步windows无线网卡信息

 

1.3设置虚拟机网络适配器为桥接模式

1.4关闭Windows无线网络使用的防火墙

1.5 重启电脑

1.6测试效果

2  ubuntu开发环境相关设置

连接无线即可.

测试效果

3  使用效果总结

尽可能提高编译主机核数以增加Active jobs

各个编译机调度受网速影响

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ACK_ACK/article/details/115274598

智能推荐

org.apache.commons.codec.binary.Base64 加密解密_org/apache/commons/codec/binary/base64-程序员宅基地

文章浏览阅读1.8w次,点赞3次,收藏5次。使用Apache的org.apache.commons.codec.binary.Base64类完成Base64加密解密_org/apache/commons/codec/binary/base64

spring项目中使用alibaba.druid.pool.DruidDataSource来装载oracle数据源-程序员宅基地

文章浏览阅读1.3k次。0、编写配置文件jdbc.type=oraclejdbc.driver=oracle.jdbc.driver.OracleDriverjdbc.url=jdbc:oracle:thin:@192.168.2.9:1521/orcljdbc.username=xbsjdbc.password=xbs1、spring-context.xml中装载配置文件..._com.alibaba.druid.pool.druiddatasource 连接oracle 配置

base64在html页面显示图片的方式_qdhph0930b.xyz-程序员宅基地

文章浏览阅读4.6w次。<img src='data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgo..._qdhph0930b.xyz

多线程-程序员宅基地

文章浏览阅读97次。多线程Java.Thread进程和线程关系及区别1.定义进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.2.关系一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.相对进

友盟自动集成报错-Could not download common (com.umeng.umsdk:common:2.0.0)_could not find com.umeng.umsdk:common:2.0.2.-程序员宅基地

文章浏览阅读1.2w次。当使用自动集成(非手动集成)友盟的时候在build.gradle里面:implementation 'com.umeng.umsdk:analytics:8.0.0'implementation 'com.umeng.umsdk:common:2.0.0'但是今天一直报错Could not download common (com.umeng.umsdk:common:2.0.0)..._could not find com.umeng.umsdk:common:2.0.2.

Docker 快速上手学习入门教程_docker菜鸟教程-程序员宅基地

文章浏览阅读2.5w次,点赞6次,收藏50次。官方解释是,docker 容器是机器上的沙盒进程,它与主机上的所有其他进程隔离。所以容器只是操作系统中被隔离开来的一个进程,所谓的容器化,其实也只是对操作系统进行欺骗的一种语法糖。_docker菜鸟教程

随便推点

【Java算法】AES前端加解密,Java后端加解密,采用CBC模式_aes-cbc前后端如何共享iv-程序员宅基地

文章浏览阅读1.4k次,点赞11次,收藏11次。适用范围:1、前端加密、解密2、后端加密、解密3、前端加密、后端解密4、后端加密、前端解密前端AESimport CryptoJS from 'crypto-js'import moment from 'moment'let key = CryptoJS.enc.Utf8.parse('abcdefg123456789') // key:必须16个字符let iv = CryptoJS.enc.Utf8.parse('abcdefg123456789'); // 偏移量:必须16个字符_aes-cbc前后端如何共享iv

oracle哈希检查数据一致性,数据文件SCN的一致性问题-程序员宅基地

文章浏览阅读110次。数据文件SCN的一致性问题1、数据库正常运行中,所有数据文件的SCN都是一致的吗?2、将一数据文件offline后,再将其online时,这个数据文件的SCN会前提吗?假如是,前提到的SCN是怎么确定的?1.数据库正常运行时,所有数据文件的SCN不一定一致。问题在这个所有上,比如Offline表空间,数据文件的SCN会被冻结,而且表空间的数据文件offline/online时又会发生文件检查点,使..._oracle 查看scn号是否一致

java cacti_cacti监控安装-程序员宅基地

文章浏览阅读115次。cacti是用PHP实现的一个软件,它用snmp服务获取数据,然后用rrdtool存储和更新数据,并生成图表展示。比较适合用于交换机、路由器的网络监控,插件众多,可图示化显示网络状况。cacti官方推荐版本如下:PHP 5.4+MySQL 5.1+RRDtool 1.3+, 1.5+ recommendedNET-SNMP 5.5+Web Server with PHP support cento..._cacti哪个版本好用

联邦学习综述-程序员宅基地

文章浏览阅读302次。联邦学习_联邦学习综述

virtuoso--工艺库答疑_tsmc mac-程序员宅基地

文章浏览阅读436次。一种带nbl_mac,一种带iso_mac?从版图结构上来看,iso_mac的管子自带bulk绕一圈,有HVNW电位,最外围加上P+ isolation。3. 有了tt, ss, ff, sf, fs后,为何既有mc lib 又有 mismatch lib?--尽量用带mac的lib。_tsmc mac

C++中的exit函数_c++ exit-程序员宅基地

文章浏览阅读6.9k次,点赞13次,收藏37次。**描述:**用来立即中止当前程序的执行,并将一个整数返回给系统,该整数的作用与“由mian函数返回的整数”相同,如果是0表示程序正常退出;如果非0表示程序异常退出。头文件#include<cstdlib>使用exit(0);//程序正常退出exit(1)//程序异常退出..._c++ exit

推荐文章

热门文章

相关标签