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

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

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

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

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

Swift - print 和 debugPrint 在吃性能你造吗?_第1张图片
当我知道print()会吃性能时.jpg

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

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

解决方案来了

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

第一步:设置DEBUG Flag。

Swift - print 和 debugPrint 在吃性能你造吗?_第2张图片
设置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()吧~

Swift - print 和 debugPrint 在吃性能你造吗?_第3张图片
测试结果.png

你可能感兴趣的:(Swift - print 和 debugPrint 在吃性能你造吗?)