此插件思路来源于《一款可以让大型iOS工程编译速度提升50%的工具》。通过使用hmap代替文件路径搜索优化预处理阶段中头文件搜索的性能实现编译速度提升。
我在另一个项目 hmap-benchmark 写了几个测试用例,统计并输出增加M个源文件,N个第三方库在使用和不使用插件的情况下的编译时间.
最新一次跑 run_benchmark.rb
脚本的时间统计为:
-
Mac mini (Intel i7/16g) :
+--------------------------------------+--------------------+------------------------------------------------------------------------------------------------------------------------+ | Case | Average(s) | Detail(s) | +--------------------------------------+--------------------+------------------------------------------------------------------------------------------------------------------------+ | 100 source files & 125 pods (origin) | 192.43606980641684 | [218.57447242736816, 178.7542200088501, 179.97951698303223] | | 100 source files & 125 pods (plugin) | 165.76690363883972 | [166.8555600643158, 165.40182876586914, 165.04332208633423] | | > optimization (speed) | 16.09% | | | > optimization (time cost) | 13.86% | | | 1 source files & 125 pods (origin) | 170.00553512573242 | [175.31463813781738, 173.79285717010498, 160.9091100692749] | | 1 source files & 125 pods (plugin) | 124.49473492304485 | [123.54309391975403, 124.4949209690094, 125.4461898803711] | | > optimization (speed) | 36.56% | | | > optimization (time cost) | 26.77% | | | Total (origin) | 181.22080246607462 | [218.57447242736816, 178.7542200088501, 179.97951698303223, 175.31463813781738, 173.79285717010498, 160.9091100692749] | | Total (plugin) | 145.1308192809423 | [166.8555600643158, 165.40182876586914, 165.04332208633423, 123.54309391975403, 124.4949209690094, 125.4461898803711] | | > optimization (speed) | 24.87% | | | > optimization (time cost) | 19.91% | | +--------------------------------------+--------------------+------------------------------------------------------------------------------------------------------------------------+
-
Mac air (Apple M1/16g) :
+--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------+ | Case | Average(s) | Detail(s) | +--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------+ | 100 source files & 125 pods (origin) | 95.07198365529378 | [91.36949586868286, 96.10968923568726, 97.73676586151123] | | 100 source files & 125 pods (plugin) | 91.2074584166289 | [90.87663986448735, 90.77357686752014, 91.97326111793518] | | > optimization (speed) | 4.24% | | | > optimization (time cost) | 4.06% | | | 1 source files & 125 pods (origin) | 81.564133644104 | [80.95829105377197, 82.07278513988386, 81.66132473945618] | | 1 source files & 125 pods (plugin) | 79.28314812668217 | [78.21958923339844, 80.21097787748413, 79.17887886892395] | | > optimization (speed) | 2.98% | | | > optimization (time cost) | 2.89% | | | Total (origin) | 88.3180586496989 | [91.36949586868286, 96.10968923568726, 97.73676586151123, 80.95829105377197, 82.07278513988386, 81.66132473945618] | | Total (plugin) | 85.2053037/161153 | [90.87663986448735, 90.77357686752014, 91.97326111793518, 78.21958923339844, 80.21097787748413, 79.17887886892395] | | > optimization (speed) | 3.65% | | | > optimization (time cost) | 3.52% | | +--------------------------------------+-------------------+--------------------------------------------------------------------------------------------------------------------+
从上面的输出日志可以看出,插件可以带来3%-36%的编译速度提升,在使用Intel芯片的机器上优化效果还是挺好的,但是在使用Apple M1芯片的机器上效果就约等于没有了,只能说是M1的性能实在牛批。如果你用的是M1,这里建议直接 return
- CocoaPods Version:
>=1.7.0
- 安装命令行工具 hmap :
brew install milend/taps/hmap
- 使用Gemfile : 在你的
Gemfile
中添加:gem 'cocoapods-project-hmap'
- 通过命令行安装 :
sudo gem install cocoapods-project-hmap
只需要在你的Podfile
中调用:plugin 'cocoapods-project-hmap'
声明使用该插件。
同时插件还为Podfile
提供了一下几个可选的方法调用:
-
set_hmap_black_pod_list: 开发插件的时候发现有些Pod target使用预生成的hmap编译会出错,比如使用了
#import "a/very/very/long/path/to/header.h"
,暂时没想到好的解决方案,所以针对这种情况需要手动添加到黑名单,不对该target的进行处理,如:set_hmap_black_pod_list(['PodA','PodB'])
,插件内置了一些这种情况的三方库,具体见:built-in black list。如果你还有其他的三方库由于其他原因编译失败,也可以把它添加到黑名单。。。 -
turn_prebuilt_hmap_off_for_pod_targets: 如果你发现有太多的三方库需要添加到黑名单,你可以直接通过调用这个方法开启“纯净模式”,关闭插件对Pod Project内部所有target的header处理,仅仅对提供给主项目使用的target处理hmap
-
set_hmap_use_strict_mode: 在一个target中引用另一个target的header,严格意义上来说应该使用
#import <PodA/Header.h>
的方式,但是有些是通过#import "Header.h"
,这种情况如果设置了对应的header search path编译是可以成功的,比如使用原生的cocoapods情况下,在项目中使用#import "Masonry.h"
、#import <Mansory.h>
和#import <Masonry/Mansory.h>
三种方式引入都是可以成功的,如果你使用这个插件并且开启这个选项后只有#import <Masonry/Mansory.h>
可以编译成功。默认为关闭。
最终你的Podfile看起来会是这样的 :
platform :ios, '10.0'
plugin 'cocoapods-project-hmap'
set_hmap_black_pod_list(['PodA','PodB'])
turn_prebuilt_hmap_off_for_pod_targets
#set_hmap_use_strict_mode(true)
target 'app' do
pod 'PodA'
...
pod 'PodB'
end
cocoapods-project-hmap is released under the MIT license. See LICENSE for details.