考虑以下数组-of strings-:
let arrayStrings = ["H", "e", "l", "l", "o"]
为了组合它的元素(将“Hello”作为单个String),我们可以:
reduce它:
let reducedString = arrayStrings.reduce("", { $0 + $1 }) // "Hello"
或者join它:
let joinedString = arrayStrings.joined() // "Hello"
两者都将返回“Hello”字符串作为输出。
但是,要确定什么是这种流程的更好选择,需要牢记的逻辑是什么?根据性能进行比较有什么区别?
joined
比reduce
更好的选择有两个原因:
reduce
和手动连接?如果您要执行的任务有特定功能,请使用它。阅读代码时,比joined
更容易理解reduce
。joined
的String
可以比reduce
更好地实施。它不一定是,但它可以。 reduce
一次只运行一个元素,不知道其他元素,传递了许多临时变量。 joined
了解整个序列,并且知道操作总是相同的,因此它可以进行优化。它甚至可以使用String
的内部结构。见String.joined implementation。总之,始终使用更具体的实现。请注意,上面的性能原因不太重要。
更新以前的结果是通过在模拟器上运行iOS应用程序获得的。在真实设备上运行应用程序,或从MacOS命令行应用程序运行代码可以得到与@Sulthan提到的类似的结果。
有趣的是,reduce
在我的机器上给出了更好的结果:
func benchmark(_ label: String, times: Int = 100000, _ f: () -> Void) {
let start = CACurrentMediaTime()
(0..<times).forEach { _ in f() }
let end = CACurrentMediaTime()
print("\(label) took \(end-start)")
}
let arrayStrings = ["H", "e", "l", "l", "o"]
benchmark("reduce", { _ = arrayStrings.reduce("", +) } )
benchmark("join", { _ = arrayStrings.joined() })
当从典型iOS应用程序的main
方法运行时,结果大约是以下数字,在Debug模式下构建:
reduce took 0.358474982960615
join took 0.582276367989834
内置于发布模式的相同应用程序提供了相同的结果顺序:
reduce took 0.126910287013743
join took 0.0291724550188519
我多次运行基准测试,reduce
在所有情况下表现都更好。虽然区别并不大,所以除非你的字符串操作在性能方面很重要,否则我建议使用joined
,该方法带有更多的语义值,它更好地传递意图。