我有一个有几千行的应用程序,在该代码中有很多println()命令.这会减慢应用程序的速度吗?它显然是在模拟器中执行的,但是当你从app store/TestFlight存档,提交和下载应用程序时会发生什么.这段代码是否仍然"活跃",那么"注释掉"的代码呢?
它是字面上永远不会读或我应该在提交测试航班/应用程序商店时删除注释掉的代码吗?
Kos*_*val 23
是的它确实减慢了代码.
无论print和println应用程序的性能下降.
println 当Swift进行代码优化时,不会删除它.
for i in 0...1_000 {
println(i)
}
Run Code Online (Sandbox Code Playgroud)
此代码无法优化,编译后汇编代码将执行一个包含1000条指令的循环,这些指令实际上没有做任何有价值的操作.
问题是Swift编译器无法使用print和println命令对代码进行最佳优化.如果您查看生成的汇编代码,可以看到它.
您可以使用Hopper Disassembler或使用swiftc编译器将Swift代码编译到Assembly来查看汇编代码:
xcrun swiftc -emit-assembly myCode.swift
Run Code Online (Sandbox Code Playgroud)
让我们看几个例子,以便更好地理解.
Swift编译器可以消除很多不必要的代码,例如:
示例:
class Object {
func nothing() {
}
}
for i in 0...1_000 {
let object = Object3(x: i)
object.nothing()
object.nothing()
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,Swift编译器会进行这种优化:
1. 删除两个nothing方法调用
在此之后,循环体只有1条指令
for i in 0...1_000 {
let object = Object(x: i)
}
Run Code Online (Sandbox Code Playgroud)
2.然后它将删除创建Object实例,因为它实际上没有使用.
for i in 0...1_000 {
}
Run Code Online (Sandbox Code Playgroud)
3.最后一步是删除空循环.
我们最终没有执行代码
print和println 这绝对不是最好的解决方案.
//println("A")
DEBUG预处理器语句使用此解决方案,您可以简单地更改debug_print函数的逻辑
debug_println("A)
func debug_println<T>(object: T) {
#if DEBUG
println(object)
#endif
}
Run Code Online (Sandbox Code Playgroud)
始终删除 print和println发布应用程序!!
如果添加print和println指令,Swift代码无法以最佳方式进行优化,并且可能导致严重的性能损失.
一般来说,你应该不会留下任何形式的采伐在生产应用程序打开时,它很可能不会影响性能,但它是不良的做法离开它启用,不必要的.
对于注释代码,这是无关紧要的,因为它将被编译器忽略而不是最终二进制文件的一部分.
看到这个答案如何println()在生产代码中禁用,有各种解决方案,删除println()发布版本iOS Swift
由于您不希望println()仅为发布版本注释掉所有调用,因此禁用它们会好得多,否则您将浪费大量时间.
| 归档时间: |
|
| 查看次数: |
3823 次 |
| 最近记录: |