【发布时间】:2021-07-03 04:06:43
【问题描述】:
我想用joined()加入一个大数组,我发现这个方法很慢,比flatMap()慢很多,这里是重现它的代码。
如你所见,joined 大约需要 0.26s,flatMap 大约需要 0.0064s,你知道为什么会这样吗?
import Foundation
var datas = [Data]()
var count = 0
(0...10000).forEach { _ in
let data = """
public struct FlattenSequence<Base: Sequence> where Base.Element: Sequence {
public struct FlattenSequence<Base: Sequence> where Base.Element: Sequence {
""".data(using: .utf8)!
datas.append(data)
count += data.count
}
// 1st approach, it takes 0.0049s, around 40 times faster than the 2nd approach.
let start1 = Date()
var wholeData1 = Data(capacity: count)
datas.forEach {
wholeData1.append($0)
}
print("Time 1: \(Date().timeIntervalSince(start1))")
// 2nd approach, it takes 0.26s,
let start2 = Date()
let wholeData2 = Data.init(datas.joined())
print("Time 2: \(Date().timeIntervalSince(start2))")
// 3rd approach, it takes 0.0064s
let start3 = Date()
let wholeData3 = Data.init(datas.flatMap { $0 })
print("Time 3: \(Date().timeIntervalSince(start3))")
print(wholeData1 == wholeData2)
print(wholeData1 == wholeData3)
print(count)
【问题讨论】:
-
通常需要注意的是:您是在启用发布模式的操场外进行测试吗?
-
@Alexander 发布模式下区别小了,但是 flatMap 还是快了很多。
-
可能是由
Data初始化程序如何处理flatMap返回的Data数组与joined()返回的FlattenSequence数组引起的 -
对于某些用例,最好的选择是链接:github.com/apple/swift-algorithms/blob/main/Guides/Chain.md
标签: swift