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

KML*_*KML 13 ios swift

我有一个有几千行的应用程序,在该代码中有很多println()命令.这会减慢应用程序的速度吗?它显然是在模拟器中执行的,但是当你从app store/TestFlight存档,提交和下载应用程序时会发生什么.这段代码是否仍然"活跃",那么"注释掉"的代码呢?

它是字面上永远不会读或我应该在提交测试航班/应用程序商店时删除注释掉的代码吗?

Kos*_*val 23

是的它确实减慢了代码.
无论printprintln应用程序的性能下降.

Println问题

println 当Swift进行代码优化时,不会删除它.

for i in 0...1_000 {
  println(i)
}
Run Code Online (Sandbox Code Playgroud)

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

分析汇编代码

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

您可以使用Hopper Disassembler或使用swiftc编译器将Swift代码编译到Assembly来查看汇编代码:

xcrun swiftc -emit-assembly myCode.swift
Run Code Online (Sandbox Code Playgroud)

Swift代码优化

让我们看几个例子,以便更好地理解.
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.最后一步是删除空循环.
我们最终没有执行代码

解决方案

  • 评论printprintln

这绝对不是最好的解决方案.
//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)

结论

始终删除 printprintln发布应用程序!!

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


Tim*_*Tim 7

一般来说,你应该不会留下任何形式的采伐在生产应用程序打开时,它很可能不会影响性能,但它是不良的做法离开它启用,不必要的.

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

看到这个答案如何println()在生产代码中禁用,有各种解决方案,删除println()发布版本iOS Swift

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