Swift - print 和 debugPrint 在吃性能你造吗?

作为一个非科班的码农,debug时唯一的一招就是print()。我不是NSLog()党,而且自从用上了Xcode 8、设置了OS_ACTIVITY_MODE = disable后,NSLog()就更不常用了。

不过可以知道的是,NSLog()在发布版本的App中,是会被编译器优化而去掉的。

更新:有同学指出,NSLog()也并不会因为Release Build而被优化。我刚刚做了个小实验,也证实了这一点。请看最后的验证测试。

问题是print()或debugPrint()也会被优化吗?
其实是不会的(笑)。

当我知道print()会吃性能时.jpg

如果你每次网络请求完,都习惯性地print一下json,或fetch完图片print一下,这些都其实会吃一部分性能。打开Time Profiler,你就会发现性能还是有一定比重的损耗的。

好吧,我把所有的print()就都注释掉!!
算了吧还是,想想都不靠谱。作为一个使命是解放生产力的码农,怎么能做这么二的事情?

解决方案来了

以下是我们的老朋友喵神onevcat给的解决方法,原文请戳这里。我们的目的是在开发环境中print,且在发布的构建中不print。

第一步:设置DEBUG Flag。

设置DEBUG Flag.jpg
设置DEBUG Flag.jpg

第二步:封装print方法。之所以加上@autoclosure,是因为想延迟对传入的表达式的计算,以进一步优化性能。

func dPrint(@autoclosure item: () -> Any) {
    #if DEBUG
    print(item())
    #endif
}

完成啦。在项目中,用dPrint()来替代print()吧。在Release的版本构建中,开启了Whole Module Optimization后,dPrint()是一个空方法,没有实现,Swift编译器会自动忽略它,运行时也就不会执行这行dPrint()了。

验证测试

过程很简单,不啰嗦了。使用Time Profiler + 真机测试,可以看出,NSLog()方法是有调用的。如果想省下这笔开销,自己封装一下NSLog(),或直接用dPrint()吧~

测试结果.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,008评论 25 709
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,305评论 30 472
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,308评论 19 139
  • ——天很暗,离开的请别回来 我知道前面走过了多少的日子 后来就死掉了多少 没有能力再把这样的感情给第二个人 深埋土...
    我如何舍得与你重逢阅读 955评论 0 0
  • 最好的祝福送给你 文/揭秋英 截止今天,高考填报志愿真正结束了,总算是结束了。 然后,一大波感慨喷涌而出。 高...
    半床诗阅读 3,508评论 2 4