我有一个拥有几千行的应用程序,在该代码中有很多println()命令。这会减慢应用程序的速度吗?它显然是在模拟器中执行的,但是当你从app store / TestFlight存档,提交和下载应用程序时会发生什么。此代码是否仍然处于活动状态",以及"注释掉的代码&#34 ;?
是否真的从未读过,或者在我提交测试航班/应用商店时是否应该删除已注释的代码?
答案 0 :(得分:23)
是的,它会减慢代码速度。
print
和println
都会降低应用程序的性能。
println
不会被删除。
for i in 0...1_000 {
println(i)
}
此代码无法优化,编译后汇编代码将执行一个包含1000条指令的循环,这些指令实际上没有做任何有价值的操作。
问题是Swift编译器无法使用print
和println
命令对代码进行最佳优化。
如果您查看生成的汇编代码,可以看到它。
您可以使用Hopper反汇编程序或使用swiftc
编译器将Swift代码编译到程序集中来查看汇编代码:
xcrun swiftc -emit-assembly myCode.swift
让我们看几个例子,以便更好地理解 Swift编译器可以消除许多不必要的代码,如:
示例强>:
class Object {
func nothing() {
}
}
for i in 0...1_000 {
let object = Object3(x: i)
object.nothing()
object.nothing()
}
在这个例子中,Swift编译器会进行这种优化:
1。删除nothing
方法调用
此后循环体只有1条指令
for i in 0...1_000 {
let object = Object(x: i)
}
2。然后它将删除创建Object
实例,因为它实际上没有使用。
for i in 0...1_000 {
}
3。最后一步是删除空循环 我们最终没有执行代码
print
和println
这绝对不是最佳解决方案
//println("A")
DEBUG
预处理程序语句使用此解决方案,您可以简单地更改debug_print函数的逻辑
debug_println("A)
func debug_println<T>(object: T) {
#if DEBUG
println(object)
#endif
}
始终从发布应用程序中删除print
和println
如果您添加print
和println
指令,Swift代码无法以最佳方式进行优化,并且可能会导致严重的性能损失。
答案 1 :(得分:7)
通常,您应该不在生产应用中保留任何形式的日志记录,这很可能不会影响性能,但是让它保持启用和不需要是不好的做法。
对于注释代码,这是无关紧要的,因为它将被编译器忽略而不是最终二进制文件的一部分。
请参阅此答案,了解如何在生产代码中停用println()
,有多种解决方案,Remove println() for release version iOS Swift
由于您不希望仅为发布版本注释掉所有println()
来电,因此最好禁用它们,否则您将浪费大量时间。
答案 2 :(得分:0)
printLn应该没有太大的影响,因为在此之前已经执行了大部分操作。
注释掉的代码有时很有用,虽然它可以使你的源代码难以阅读但它对性能完全没有任何影响,而且我从来没有因为注释掉的代码而拒绝任何东西而且我的东西充满了它。