使用reduce或join组合数组有什么区别?

问题描述 投票:4回答:2

考虑以下数组-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”字符串作为输出。

但是,要确定什么是这种流程的更好选择,需要牢记的逻辑是什么?根据性能进行比较有什么区别?

arrays swift performance reduce
2个回答
7
投票

joinedreduce更好的选择有两个原因:

  1. 可读性 如果要将多个字符串连接成一个字符串,为什么要使用reduce和手动连接?如果您要执行的任务有特定功能,请使用它。阅读代码时,比joined更容易理解reduce
  2. 性能 joinedString可以比reduce更好地实施。它不一定是,但它可以。 reduce一次只运行一个元素,不知道其他元素,传递了许多临时变量。 joined了解整个序列,并且知道操作总是相同的,因此它可以进行优化。它甚至可以使用String的内部结构。见String.joined implementation

总之,始终使用更具体的实现。请注意,上面的性能原因不太重要。


2
投票

更新以前的结果是通过在模拟器上运行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,该方法带有更多的语义值,它更好地传递意图。

© www.soinside.com 2019 - 2024. All rights reserved.