Closed casscqt closed 4 years ago
QMUIConfiguration.m 里的 applyInitialTemplate
耗时主要是在寻找配置表的操作上,因为支持多份配置表,因此需要拿到所有的 class 再用特定规则去遍历查找匹配的 class。之前通过 runtime 提供的 objc_getClassList()
获取整个 App 里所有 class(包含系统库和链接的第三方库),这个操作在 QD 这种量级的应用(两万多个 class)里大概耗时 0.04s,在 WeRead 这种量级的应用(三万多个 class)里大概 0.1s,在这个 https://github.com/Tencent/QMUI_iOS/commit/c53f0a97c224d757fe08d1f425990cf52688a075 里,我们将其改为从 Mach-O 的 (DATA, objc_classlist) 里读取当前应用的 class,不包含系统库和第三方库,所以速度得到明显提升,目前的耗时保持在 0.00x 秒级别,可以忽略不计,而整个 applyInitialTemplate
方法的耗时也在 0.02s 左右,希望这个提升能满足你的诉求。目前这个提交尚未带到版本里,如果你希望体验,可以将项目的 Podfile 里对 QMUI 的引用改为下面这样,即可拉取最新代码:
pod 'QMUIKit', :git => 'https://github.com/Tencent/QMUI_iOS.git'
至于你提的开关,其实既然你希望把配置表关闭,那你可以把配置表从项目里去除,配置表在 QMUI 框架里不是必须的,去掉之后,applyInitialTemplate
也就不耗时了。
一、现存问题: 当前没有使用ConfigurationTemplate配置表功能时,applyInitialTemplate也进行了所有文件遍历。如果业务在类文件load函数中进行UI对象创建,则会触发_dyld_start阶段的时间消耗。
在iPhone6s Plus 70ms+,工程文件多会消耗多一些。
二、建议:
如果业务没有进行全局 UI 配置表功能,是否可以有开关进行关闭。减少不必要的消耗,虽然只有几十毫秒,但是对于启动的优化时间都是一点点抠出来的。是否可以对全局UI配置表功能有一个功能开关,如果没有使用到该功能可以进行关闭?