ccache - 让Xcode编译速度飞起来
今天来介绍一个小工具ccache
,其可以提高xcode
的编译速度。说起缘由,是因为我的苹果电脑配置比较低,而每次开发调试或测试打包都需要编译工程,虽然项目工程代码量不算大,但是编译的时间还是很长,尤其是修改了头文件或者Archive
打包时,看着进度条像蜗牛在爬一样,心里都有小动物在奔腾......
好在遇到了ccache
,其原理是通过把项目的源文件用ccache
编译器编译,然后缓存编译生成的信息,从而在下一次编译时,利用这个缓存加快编译的速度,目前支持的语言有:C
、C++
、Objective-C
、Objective-C++
,但是如果找不到ccache
编译器,那么还是会选择clang
编译器来编译源文件。下面介绍一下具体的应用过程:
添加ccache脚本
下面是ccache
的编译脚本,命名为:ccache-clang
,需要添加到工程根目录,ccache
就是通过这个脚本来选择编译器的,该脚本的详细介绍如下:
第1行:指定这是一个bash
脚本
第2行:type -p ccache
判断是否存在ccache
命令,/dev/null
是空设备文件,2>&1
是把标准错误流重定向到标准输出流,所以整行的作用是先判断命令是否存在,如果不存在就把标准错误流重定向成标准输出流后,再重定向到空文件,这样错误就不会在控制台上打印出来了
第3行:设置最大的缓存
第4行:设置源文件的编译模式,默认是true
,ccache
会先处理源文件,如果缓存没有命中,就编译源文件;而如果是false
,就会在缓存没有命中时,不是直接编译源文件,而是编译处理后的文件,但是这可能会有问题,因为不同的编译器,预处理后的文件内容不完全相同
第5行:设置为true
,表明ccache
直接利用缓存目录下的文件,而不是拷贝后的文件,这样可以加快编译速度,默认是false
第6行:设置提高缓存命中率,忽略__FILE__、DATE、__TIME__等宏,也不检查文件的修改和创建时间是否是最新的等等
第9行:指定日志文件的路径
第10行:执行/usr/bin/clang
命令,"$@"
是指所有参数
第12行:执行系统默认的clang
命令,"$@"
是指所有参数
#!/bin/sh
if type -p ccache >/dev/null 2>&1; then
export CCACHE_MAXSIZE=10G
export CCACHE_CPP2=true
export CCACHE_HARDLINK=true
export CCACHE_SLOPPINESS=file_macro,time_macros,include_file_mtime,include_file_ctime,file_stat_matches
# 指定日志文件路径到桌面,等下排查集成问题有用,集成成功后删除,否则很占磁盘空间
export CCACHE_LOGFILE='~/Desktop/CCache.log'
exec ccache /usr/bin/clang "$@"
else
exec clang "$@"
fi
如果你的代码或者三方库里的代码中有C++
文件,则需要把脚本命名为:ccache-clang++
,同时,脚本中的clang
也需要修改为clang++
,如下:
#!/bin/sh
if type -p ccache >/dev/null 2>&1; then
export CCACHE_MAXSIZE=10G
export CCACHE_CPP2=true
export CCACHE_HARDLINK=true
export CCACHE_SLOPPINESS=file_macro,time_macros,include_file_mtime,include_file_ctime,file_stat_matches
# 指定日志文件路径到桌面,等下排查集成问题有用,集成成功后删除,否则很占磁盘空间
export CCACHE_LOGFILE='~/Desktop/CCache.log'
exec ccache /usr/bin/clang++ "$@"
else
exec clang++ "$@"
fi
配置Xcode项目
1.添加一个CC常量
在项目的Build Settings
里,添加一个常量:CC
,值为脚本的完整路径:$(SRCROOT)/ccache-clang
(脚本在根目录下)
添加CC
常量
因为ccache
不支持Clang Modules
,所以需要关闭项目的Modules
选项,如果你的工程里有用的@import UIKit
等,那么现在需要替换为#import <UIKit/UIKit>
,这是因为关闭Moduels
后,Xcode
不会再自动导入模块了,对于其他的模块,你还需要在Linked Frameworks and Libraries
里手动导入所需模块。
配置Pod项目
如果项目中用到了CocoaPods
,还需要设置Pod
工程,因为Pod
工程也需要关闭Modules
选项,我们可以按照修改Xcode
项目的方法来修改Pod
工程的modules
配置,但是每次pod update
会把Pod
工程重新生成,Modules
选项又被改回去了,所以我们直接在Podfile
里加入下面的代码,让Pod
工程在生成的时候就关闭Modules
选项,同时加入CC
常量,就可以在编译时用缓存加速了。
但是,由于我们关闭了modules
选项,如果某个Pod
工程用到了系统的框架,则需要按照Xcode
工程的方法添加到对应的Pod
工程里,否则会提示Undefined symbols xxx for architecture arm7
等等,尽管每次更新Pod
后,都需要重新添加所需的框架,但是考虑到编译速度的提升,而Pod
不会经常更新,所以也不是很麻烦。
post_install do |installer_representation|
installer_representation.pods_project.targets.each do |target|
target.build_configurations.each do |config|
#关闭 Enable Modules
config.build_settings['CLANG_ENABLE_MODULES'] = 'NO'
# 在生成的 Pods 项目文件中加入 CC 参数,路径的值根据你自己的项目来修改
config.build_settings['CC'] = '$(PODS_ROOT)/ccache-clang'
end
end
end
应用ccache
设置完成后,就可以利用ccache
了,首次因为还没有缓存,要添加缓存,所以编译的时间会比没有用ccache
要多一会儿,但是从第二次之后,会有缓存命中,就可以加快编译速度了,多次之后,可以明显感觉到,编译的速度快了许多,一般至少了加快一倍以上,我们也可以用命令来查看ccache -s
的缓存的命中情况:
可以看到,现在的缓存命中率是53.01%
,以前打包需要10分钟,现在3分钟搞定,喝茶的时间又多了,是不是很开森,_。
通过添加ccache
,项目的编译速度得到了极大的提升,对于需要花费很长时间进行编译的项目,是十分值得的。
ccache — a fast C/C++ compiler cache
linux中shell变量$#,$@,$0,$1,$2的含义解释
ccache - 让Xcode编译速度飞起来的更多相关文章
- 加快XCode的编译链接速度(200%+)—XCode编译速度慢的解决方案
最近在开发一个大项目的时候遇到一个很头疼的问题,由于项目代码较多,每次都要编译链接1分钟左右,调试的时候很浪费时间,于是研究了一下如何提高编译链接的速度,在这里分享给大家. 提升编译链接的速度主要有以 ...
- iOS进阶--提高XCode编译速度、Xcode卡顿解决方案
提升编译链接的速度主要有以下三个方式: 1. 提高XCode编译时使用的线程数 defaults write com.apple.Xcode PBXNumberOfParallelBuildSubta ...
- XCode编译速度慢的解决方案
提升编译链接的速度主要有以下三个方式: 1. 提高XCode编译时使用的线程数 defaults write com.apple.Xcode PBXNumberOfParallelBuildSubta ...
- 快速提高 Xcode 编译速度的方法(转载自网上一个大神的方法)
1.,中的 Debug Information Format 的选项中选择 DWARF ,平时调试就是用整个选项,经过测试,速度确实有很大的提升,等发行版本的时候在调回 DWARF with dsYM ...
- 加快XCode编译链接速度(200%+)—XCode编译慢液
最近在一个大型项目的开发的时候遇到一个很头疼的问题,由于该项目的代码更,每次建立联系1纪要.浪费时间调试.因此,一些研究如何提高编译链接速度,这里给大家分享. 为了提高编译和链接的是以下三种方式的速度 ...
- 如何加快C++代码的编译速度 转 ccache
http://www.cnblogs.com/baiyanhuang/archive/2010/01/17/1730717.html C++代码一直以其运行时的高性能高调面对世人, 但是说起编译速 ...
- iOS进阶--将项目的编译速度提高5倍
前言 作为开发团队的负责人,最近因为在快速迭代开发新功能,项目规模急速增长,单个端业务代码约23万行,私有库约6万行,第三方库代码约15万行,单个客户端的代码行数约60万.现在打包一次耗时需要11~1 ...
- 怎样使用 CCache 进行 cocos2d-x 编译加速
https://github.com/chukong/cocos-docs/blob/master/manual/framework/native/v3/ccache-speed-up/zh.md C ...
- 微信团队分享:极致优化,iOS版微信编译速度3倍提升的实践总结
1.引言 岁月真是个养猪场,这几年,人胖了,微信代码也翻了. 记得 14 年转岗来微信时,用自己笔记本编译微信工程才十来分钟.如今用公司配的 17 年款 27-inch iMac 编译要接近半小时:偶 ...
随机推荐
- JDBC02 利用JDBC连接数据库【使用数据库连接池】
目录 1/2/3 Statement 和 Preparedstatement 的区别 4 读取properties配置文件 5 数据库连接池 6 利用数据库连接池连接数据库 1 使用Statemen ...
- jstack
简介 jstack用于打印出给定的java进程ID的Java堆栈信息,一般用于检查应用的线程问题,死锁问题 常用命令 jstack 输出 $ jstack 11376 2014-01-21 20:36 ...
- 搭建SSM项目框架全过程及思考
1.前言 之前都是在现有框架下进行写代码或者总是看一些别人的架构,总会眼高手低.于是打算自己完整的走一遍流程,同时把所遇到的问题,思考的问题记下来,供大家参考.由于是工作年限不高,属于新手,不足之处还 ...
- 浅谈身为小白学习Linux系统的四点实用建议
游戏.办公.安全,可以总结为是方便当代人们在生活中的刚需,我们大都是这些服务的使用者,而把单个功能整合起来那就必须谈到互联网,自然而然通过互联网要将Service发送给Service manageme ...
- 集群之mysql主从配置(windows和linux版)
起因 由于网站进一步开发运行的需求,要求主机7*24小时运行正常,同时要求能够防止数据库灾难.考虑到后期的开发程度和业务量,准备向高可用系统进行改变,同时通过负载均衡提高网络性能.于是第一步就考虑到了 ...
- tcp入门(唐唐的故事)
1,互联网的实现,分成好几层.每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持.把互联网分成五层,容易让人理解. 2,对这五层的理解(唐唐讲故事): 实体层:目的就是把计算机连接起来,用电气 ...
- co 模块
1.co 模块,它基于 ES6 的 generator 和 yield ,让我们能用同步的形式编写异步代码. 2.co 模块是能让我们以同步的形式编写异步代码的 nodejs 模块 3.学习网络地址: ...
- nyoj_68:三点顺序(计算几何)
题目链接 根据 AB*AC的值进行判断即可(ps,结果为0时不构成三角形) #include<iostream> #include<cstdio> #include<cs ...
- zoj 3963 heap partion
https://vjudge.net/problem/ZOJ-3963 题意: 给出一个数列,可以用这个数列构造一种二叉树,这个二叉树满足数的下标 i <= j,并且 si <= sj,s ...
- ARM开发(2)基于STM32的蜂鸣器
基于STM32的蜂鸣器 一 蜂鸣器原理: 1.1 本实验实现1个蜂鸣器间隔1S鸣叫. 1.2 实验思路:根据电路图原理,给蜂鸣器相关引脚赋予高低电平,实现电路的导通,使蜂鸣器实现鸣叫或不鸣. 1 ...