【发布时间】:2018-11-29 16:13:19
【问题描述】:
我有两个功能:
extension Array where Element: Hashable {
func uniqueOrderly() -> [Element] {
let startTime = CFAbsoluteTimeGetCurrent()
var set = Set<Element>()
var array = [Element]()
for element in self {
if set.contains(element) {
continue
}
set.insert(element)
array.append(element)
}
let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
print("Time for uniqueOrderly: \(timeElapsed)")
return array
}
}
第二个:
public extension Sequence where Element: Equatable {
func unique() -> [Element] {
let startTime = CFAbsoluteTimeGetCurrent()
var unique: [Element] {
return reduce(into: []) {
unique, x in
if !unique.contains(x) {
unique.append(x)
}
}
}
let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
print("Time for unique: \(timeElapsed)")
return unique
}
}
我正在对数组进行函数执行时间测量。
那是:
let arrayToFilter = [1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1,1,2,4,6,1,2,5,7,9,3,3,1]
实际的函数调用和结果是这样的:
arrayToFilter.unique() //Time for unique: 0.00012195110321044922
arrayToFilter.uniqueOrderly() Time for uniqueOrderly: 0.02329099178314209
但是当我更改函数调用的顺序时,我的 unique() 函数会显示可怕的时间测量结果。
arrayToFilter.uniqueOrderly() //Time for uniqueOrderly: 0.0013059377670288086
arrayToFilter.unique() //Time for unique: 8.940696716308594e-06
所以我的问题是为什么我在不同的函数调用顺序下会出现这种情况?此外,当我在 for 循环中运行这些测试时,测量结果完全不同。 (大约 +- 1 秒)
所有 mesurants 都是在 Playground 和具有 Release 构建设置的真实 iOS 应用程序中完成的(在模拟器上)。
测试规范:
Xcode 10.1 版
斯威夫特 4.2
【问题讨论】:
-
首先,你在哪里测试这个?确保您在真实设备上的优化构建中进行测试。切勿在操场上测试性能。
-
@rmaddy 我用您要求的信息更新我的问题。
-
@rmaddy 如果您需要,我可以添加日志并删除执行时间。
标签: ios arrays swift sorting set