print()/ println()执行速度慢吗?

时间:2015-02-26 09:42:06

标签: ios swift

我有一个拥有几千行的应用程序,在该代码中有很多println()命令。这会减慢应用程序的速度吗?它显然是在模拟器中执行的,但是当你从app store / TestFlight存档,提交和下载应用程序时会发生什么。此代码是否仍然处于活动状态",以及"注释掉的代码&#34 ;?

是否真的从未读过,或者在我提交测试航班/应用商店时是否应该删除已注释的代码?

3 个答案:

答案 0 :(得分:23)

是的,它会减慢代码速度。
printprintln都会降低应用程序的性能。

Println问题

当Swift进行代码优化时,

println不会被删除。

for i in 0...1_000 {
  println(i)
}

此代码无法优化,编译后汇编代码将执行一个包含1000条指令的循环,这些指令实际上没有做任何有价值的操作。

分析汇编代码

问题是Swift编译器无法使用printprintln命令对代码进行最佳优化。 如果您查看生成的汇编代码,可以看到它。

您可以使用Hopper反汇编程序或使用swiftc编译器将Swift代码编译到程序集中来查看汇编代码:

xcrun swiftc -emit-assembly myCode.swift

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。最后一步是删除空循环 我们最终没有执行代码

解决方案

  • 评论printprintln

这绝对不是最佳解决方案 //println("A")

  • 使用DEBUG预处理程序语句

使用此解决方案,您可以简单地更改debug_print函数的逻辑 debug_println("A)

func debug_println<T>(object: T) {
  #if DEBUG
    println(object)
  #endif
}

结论

始终从发布应用程序中删除printprintln

如果您添加printprintln指令,Swift代码无法以最佳方式进行优化,并且可能会导致严重的性能损失。

答案 1 :(得分:7)

通常,您应该在生产应用中保留任何形式的日志记录,这很可能不会影响性能,但是让它保持启用和不需要是不好的做法。

对于注释代码,这是无关紧要的,因为它将被编译器忽略而不是最终二进制文件的一部分。

请参阅此答案,了解如何在生产代码中停用println(),有多种解决方案,Remove println() for release version iOS Swift

由于您不希望仅为发布版本注释掉所有println()来电,因此最好禁用它们,否则您将浪费大量时间。

答案 2 :(得分:0)

printLn应该没有太大的影响,因为在此之前已经执行了大部分操作。

注释掉的代码有时很有用,虽然它可以使你的源代码难以阅读但它对性能完全没有任何影响,而且我从来没有因为注释掉的代码而拒绝任何东西而且我的东西​​充满了它。