1. 使用tmpfs来代替部分IO读写

  2. ccache,可以将ccache的缓存文件设置在tmpfs上,但是这样的话,每次开机后,ccache的缓存文件会丢失

  3.distcc,多机器编译

  4.将屏幕输出打印到内存文件或者/dev/null中,避免终端设备(慢速设备)拖慢速度。

  项目越来越大,每次需要重新编译整个项目都是一件很浪费时间的事情。Research了一下,找到以下可以帮助提高速度的方法,总结一下。

  tmpfs

  有人说在Windows下用了RAMDisk把一个项目编译时间从4.5小时减少到了5分钟,也许这个数字是有点夸张了,不过粗想想,把文件放到内存上做编译应该是比在磁盘上快多了吧,尤其如果编译器需要生成很多临时文件的话。

  这个做法的实现成本最低,在Linux中,直接mount一个tmpfs就可以了。而且对所编译的工程没有任何要求,也不用改动编译环境。

  mount -t tmpfs tmpfs ~/build -o size=1G

  用2.6.32.2的Linux Kernel来测试一下编译速度:

  用物理磁盘:40分16秒

  用tmpfs:39分56秒

  呃……没什么变化。看来编译慢很大程度上瓶颈并不在IO上面。但对于一个实际项目来说,编译过程中可能还会有打包等IO密集的操作,所以只要可能,用tmpfs是有益无害的。当然对于大项目来说,你需要有足够的内存才能负担得起这个tmpfs的开销。

  make -j

  既然IO不是瓶颈,那CPU就应该是一个影响编译速度的重要因素了。

  用make -j带一个参数,可以把项目在进行并行编译,比如在一台双核的机器上,完全可以用make -j4,让make最多允许4个编译命令同时执行,这样可以更有效的利用CPU资源。

  还是用Kernel来测试:

  用make: 40分16秒

  用make -j4:23分16秒

  用make -j8:22分59秒

  由此看来,在多核CPU上,适当的进行并行编译还是可以明显提高编译速度的。但并行的任务不宜太多,一般是以CPU的核心数目的两倍为宜。

  不过这个方案不是完全没有cost的,如果项目的Makefile不规范,没有正确的设置好依赖关系,并行编译的结果就是编译不能正常进行。如果依赖关系设置过于保守,则可能本身编译的可并行度就下降了,也不能取得最佳的效果。

  ccache

  ccache用于把编译的中间结果进行缓存,以便在再次编译的时候可以节省时间。这对于玩Kernel来说实在是再好不过了,因为经常需要修改一些Kernel的代码,然后再重新编译,而这两次编译大部分东西可能都没有发生变化。对于平时开发项目来说,也是一样。为什么不是直接用make所支持的增量编译呢?还是因为现实中,因为Makefile的不规范,很可能这种“聪明”的方案根本不能正常工作,只有每次make clean再make才行。

  安装完ccache后,可以在/usr/local/bin下建立gcc,g++,c++,cc的symbolic link,链到/usr/bin/ccache上。总之确认系统在调用gcc等命令时会调用到ccache就可以了(通常情况下/usr/local /bin会在PATH中排在/usr/bin前面)。

  安装的另外一种方法:

  vi ~/.bash_profile

  把/usr/lib/ccache/bin路径加到PATH下

  PATH=/usr/lib/ccache/bin:$PATH:$HOME/bin

  这样每次启动g++的时候都会启动/usr/lib/ccache/bin/g++,而不会启动/usr/bin/g++

  效果跟使用命令行ccache g++效果一样:)

  这样每次用户登录时,使用g++编译器时会自动启动ccache

  继续测试:

  用ccache的第一次编译(make -j4):23分38秒

  用ccache的第二次编译(make -j4):8分48秒

  用ccache的第三次编译(修改若干配置,make -j4):23分48秒

  看来修改配置(我改了CPU类型...)对ccache的影响是很大的,因为基本头文件发生变化后,就导致所有缓存数据都无效了,必须重头来做。但如果只是修改一些.c文件的代码,ccache的效果还是相当明显的。而且使用ccache对项目没有特别的依赖,布署成本很低,这在日常工作中很实用。

  可以用ccache -s来查看cache的使用和命中情况:

  cache directory                     /home/lifanxi/.ccachecache hit                           7165cache miss                         14283called for link                       71not a C/C++ file                     120no input file                       3045files in cache                     28566cache size                          81.7 Mbytesmax cache size                     976.6 Mbytes

  可以看到,显然只有第二编次译时cache命中了,cache miss是第一次和第三次编译带来的。两次cache占用了81.7M的磁盘,还是完全可以接受的。

  distcc

  一台机器的能力有限,可以联合多台电脑一起来编译。这在公司的日常开发中也是可行的,因为可能每个开发人员都有自己的开发编译环境,它们的编译器版本一般是一致的,公司的网络也通常具有较好的性能。这时就是distcc大显身手的时候了。

  使用distcc,并不像想象中那样要求每台电脑都具有完全一致的环境,它只要求源代码可以用make -j并行编译,并且参与分布式编译的电脑系统中具有相同的编译器。因为它的原理只是把预处理好的源文件分发到多台计算机上,预处理、编译后的目标文件的链接和其它除编译以外的工作仍然是在发起编译的主控电脑上完成,所以只要求发起编译的那台机器具备一套完整的编译环境就可以了。

  distcc安装后,可以启动一下它的服务:

  /usr/bin/distccd  --daemon --allow 10.64.0.0/16

  默认的3632端口允许来自同一个网络的distcc连接。

  然后设置一下DISTCC_HOSTS环境变量,设置可以参与编译的机器列表。通常localhost也参与编译,但如果可以参与编译的机器很多,则可以把localhost从这个列表中去掉,这样本机就完全只是进行预处理、分发和链接了,编译都在别的机器上完成。因为机器很多时,localhost的处理负担很重,所以它就不再“兼职”编译了。

  export DISTCC_HOSTS="localhost 10.64.25.1 10.64.25.2 10.64.25.3"

  然后与ccache类似把g++,gcc等常用的命令链接到/usr/bin/distcc上就可以了。

  在make的时候,也必须用-j参数,一般是参数可以用所有参用编译的计算机CPU内核总数的两倍做为并行的任务数。

  同样测试一下:

  一台双核计算机,make -j4:23分16秒

  两台双核计算机,make -j4:16分40秒

  两台双核计算机,make -j8:15分49秒

  跟最开始用一台双核时的23分钟相比,还是快了不少的。如果有更多的计算机加入,也可以得到更好的效果。

  在编译过程中可以用distccmon-text来查看编译任务的分配情况。distcc也可以与ccache同时使用,通过设置一个环境变量就可以做到,非常方便。

  总结一下:

  tmpfs: 解决IO瓶颈,充分利用本机内存资源

  make -j: 充分利用本机计算资源

  distcc: 利用多台计算机资源

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

  这些工具的好处都在于布署的成本相对较低,综合利用这些工具,就可以轻轻松松的节省相当可观的时间。上面介绍的都是这些工具最基本的用法,更多的用法可以参考它们各自的man page。

  5.还有提速方法是把屏幕输出重定向到内存文件或/dev/null,因对终端设备(慢速设备)的阻塞写操作也会拖慢速度。推荐内存文件,这样发生错误时,能够查看。

转载于:https://www.cnblogs.com/zxc2man/p/3453792.html

kernel编译速度提高相关推荐

  1. Next.js 7.0正式发布:重新编译速度提高42%,支持WebAssembly

    在经过26次金丝雀发布和340万次下载之后,现在,我们正式推出生产就绪的Next.js 7. \\ DX改进:启动速度提高57%,重新编译速度提高42%:\\t 使用react-error-overl ...

  2. 【转】Linux程序编译速度提高方法

    项目越来越大,每次需要重新编译整个项目都是一件很浪费时间的事情.Research了一下,找到以下可以帮助提高速度的方法,总结一下. tmpfs 有人说在Windows下用了RAMDisk把一个项目编译 ...

  3. Linux程序编译速度提高方法

    2019独角兽企业重金招聘Python工程师标准>>> 项目越来越大,每次需要重新编译整个项目都是一件很浪费时间的事情.Research了一下,找到以下可以帮助提高速度的方法,总结一 ...

  4. [贝聊科技]如何将 iOS 项目的编译速度提高5倍

    前言 贝聊目前开发的两款App分别是贝聊家长版和贝聊老师版,最近因为在快速迭代开发新功能,项目规模急速增长,单个端业务代码约23万行,私有库约6万行,第三方库代码约15万行,单个客户端的代码行数约60 ...

  5. xcode修改时间后就要重新编译_iOS 微信编译速度优化分享

    前言 岁月真是个养猪场,这几年,人胖了,微信代码也翻了.记得 14 年转岗来微信时,用自己笔记本编译微信工程才十来分钟.如今用公司配的 17 年款 27-inch iMac 编译要接近半小时:偶然间更 ...

  6. 微信团队分享:极致优化,iOS版微信编译速度3倍提升的实践总结

    1.引言 岁月真是个养猪场,这几年,人胖了,微信代码也翻了. 记得 14 年转岗来微信时,用自己笔记本编译微信工程才十来分钟.如今用公司配的 17 年款 27-inch iMac 编译要接近半小时:偶 ...

  7. VS 2008 Web Site Project编译和发布速度提高办法

    在Bin目录中很多dll文件附加了一个.refresh的扩展名文件,这个文件基本意思就是,帮你同步最新的dll程序,避免程序不同步,如果确实这个dll不常更新.可以删掉它,这个编译速度会有一定的提高. ...

  8. 使用预编译头提高编译速度

    什么是预编译头 在介绍预编译头之前,有必要了解一下C/C++的编译方式.C/C++的编译单元是源文件(带有.c..cc..cpp等扩展名的文件),在编译一个源文件之前,预处理器会把这个源文件中所有通过 ...

  9. iOS之性能优化·提高App的编译速度

    一.前言 经过多年的开发和迭代,我相信很多的 iOS 项目代码已经达到几十万行甚至上百万行的规模,所使用的 Pod 库的数量可以达到几十个甚至上百个,App Store 安装包也变得越来越大,在这么大 ...

  10. 提高vivado的编译速度

    提高vivado的编译速度 如何充分使用自己的电脑硬件资源提高vivado的编译速度 如何读取当前线程数 如何设置当前线程数 如何充分使用自己的电脑硬件资源提高vivado的编译速度 在编译vivad ...

最新文章

  1. Javascript将构造函数扩展为简单工厂
  2. 并发集合和普通集合以及安全集合的区别
  3. Android动画 详解(一 补间动画)
  4. eclipse如何给main函数传参数
  5. 程序一启动检查网络,如果没有网络就退出程序
  6. Flask的csrf_token的用法
  7. 网易 html5,别再想不开做H5了
  8. hibernate3连接mysql8报错_MySQL的8小时连接超时时间,导致系统过夜即崩溃,报错Could not roll back Hibernate transaction...
  9. hash算法总结收集
  10. SLAM--搭建自己的视觉里程计VO-RGBD相机(一)
  11. 模式识别经典算法——LDA
  12. Excel中使用 TREND函数对缺失数据进行插值
  13. 肩周炎的治疗方法哪个最有效
  14. ffmpeg实现视频切割
  15. vscode格式化报错
  16. 20172328 2018-2019《Java软件结构与数据结构》第六周学习总结
  17. 天田AMADA数控折弯机触摸屏维修RGM21003主机电路板维修
  18. 失踪61年的上帝之鸟重回美国阿肯色州 (组图)
  19. 10-230 查询计算机工程专业学生选修但软件工程专业学生没有选修的课程
  20. CloudSim Plus能耗仿真(一)

热门文章

  1. Android 热补丁之 Tinker 原理解析
  2. 电脑下载python3.5.2教程_Win10系统如何搭建Python 3.5.2开发环境
  3. [19/03/12-星期二] 数组_遍历(for-each)复制java.util.Arrays类
  4. bzoj 1119 [POI2009] SLO bzoj 1697 牛排序 —— 置换+贪心
  5. Java - HashMap源码解析
  6. day05_日常SQL练习(一)
  7. 第一章 Java代码执行流程
  8. 浪潮之巅--蓝色巨人读后感
  9. Linux必学的60个命令【转载】
  10. @符号的几种用法总结