热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何提高工程编译速度

点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,麻烦点个在看或点个赞,感谢~     文章首发  公众号——Pou光明公众号还在维护,大家莫慌~LinuxQt平台为例测试编译


点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,麻烦点个在看或点个赞,感谢~         文章首发   公众号—— 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自动使用 ccacheqmake 生成的 Makefile 中未使用 ccache.


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


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


2.1 1 icecc 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)


Qt 中使用 icecc


#Qt pro中添加


equals(COMPILE,2){


QMAKE_CXX = icecc g++


}


Qt使用 iceccccache


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


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





推荐阅读
  • 深入探讨Web服务器与动态语言的交互机制:CGI、FastCGI与PHP-FPM
    本文详细解析了Web服务器(如Apache、Nginx等)与动态语言(如PHP)之间通过CGI、FastCGI及PHP-FPM进行交互的具体过程,旨在帮助开发者更好地理解这些技术背后的原理。 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 在进行QT交叉编译时,可能会遇到与目标架构不匹配的宏定义问题。例如,当为ARM或MIPS架构编译时,需要确保使用正确的宏(如QT_ARCH_ARM或QT_ARCH_MIPS),而不是默认的QT_ARCH_I386。本文将详细介绍如何正确配置编译环境以避免此类错误。 ... [详细]
  • 访问一个网页的全过程
    准备:DHCPUDPIP和以太网启动主机,用一根以太网电缆连接到学校的以太网交换机,交换机又与学校的路由器相连.学校的这台路由器与一个ISP链接,此ISP(Intern ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • 本文详细记录了作者从7月份的提前批到9、10月份正式批的秋招经历,包括各公司的面试流程、技术问题及HR面的常见问题。通过这次秋招,作者深刻体会到了技术积累和面试准备的重要性。 ... [详细]
  • OpenWrt 是一款高度可定制的嵌入式 Linux 发行版,广泛应用于无线路由器等领域,拥有超过百个预装软件包。本文详细探讨如何在 OpenWrt 上通过 Luci 构建自定义模块,以扩展其功能。 ... [详细]
  • 本文详细记录了在Ubuntu 9.10操作系统上从零开始搭建LAMP(Linux, Apache, MySQL, PHP)环境的过程,包括遇到的问题及解决方案。旨在为初次尝试搭建LAMP环境的开发者提供参考。 ... [详细]
  • 我们正在使用GNU Make来构建我们的系统,在makefile文件的末尾,我们通过一个名为Makedepends的包含来生成一系列的.d文件。然而,当文件被删除或移动时,依赖关系会中断,我们需要寻找一种方法来优雅地处理这种情况。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • ElasticSearch 集群监控与优化
    本文详细介绍了如何有效地监控 ElasticSearch 集群,涵盖了关键性能指标、集群健康状况、统计信息以及内存和垃圾回收的监控方法。 ... [详细]
  • 本文详细介绍了 Python 中的条件语句和循环结构。主要内容包括:1. 分支语句(if...elif...else);2. 循环语句(for, while 及嵌套循环);3. 控制循环的语句(break, continue, else)。通过具体示例,帮助读者更好地理解和应用这些语句。 ... [详细]
  • 如何在Notepad++中执行Python代码
    Notepad++是一款功能丰富的文本编辑器,不仅支持多种编程语言的语法高亮显示,还提供了便捷的代码执行功能。本文将详细介绍如何在Notepad++中配置并运行Python代码。 ... [详细]
author-avatar
fkg7571831
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有