调用 removeLast
非常慢(弹出 77k 元素需要几分钟)。 documentation说 O(1),我认为实现只会减少数组大小。显然不是:
为什么调用 remove(at: Int)
?
这个重现案例比我预期的要慢(我已经习惯了 C++ 的 std::vector
性能),但仍然没有我在代码中看到的那么慢:
var array = [ Int ]()
for i in 0..<262144 {
array.append(i)
}
print ("done appending") // we get here immediately
let n = array.count
for _ in 0..<n {
array.removeLast() // popLast is also slow
}
print ("done")
这在我的机器上需要 16 秒。等效的 C++ 程序需要 0.002 秒。
最佳答案
问题在于您的测试方式。 没有调试版本中的速度测试丝毫没有意义。这就是为什么您应该始终在Instruments 中配置文件。它使用发布版本。要获得逼真的结果,请在设备上的 Instruments 中进行配置。其他一切都是幻觉。
发布版本也是如此,而不是调试版本。您会发现实际上您立即获得了两个print
语句。
结果(在我的电脑上,而不是设备上,因为我懒得 Handlebars 机从口袋里拿出来)显示自引用日期以来的秒数:
starting 506917910.056674
done appending 506917910.060245
done 506917910.069827
关于arrays - swift array removeLast 极慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41816801/