【发布时间】:2023-03-24 19:50:01
【问题描述】:
为什么?
给定以下 Swift 代码:
struct DemoStruct {
let buf: [UInt8]
init?(fromArray buf: [UInt8]) {
guard buf.count == 6 else {
return nil
}
self.buf = buf
}
var containsJustZeros: Bool {
// test code
}
}
let data = DemoStruct(fromArray: Array(repeating: 0, count: 6))!
if data.containsJustZeros {
print("zeros")
}
对于test code 部分,我已经实现并测量了以下实现:
self.buf == Array(repeating: 0, count: 6)for dig in self.buf where dig != 0 { return false } return trueself.buf.elementsEqual(Array(repeating: 0, count: 6))
第一个代码最快(~13 秒/10 000 000 次测试),最后一个代码最慢(~43 秒/10 000 000 次测试)。还有其他可能的实现吗?我想优化我的代码以提高速度并更好地理解 Swift。
【问题讨论】:
-
您的问题是关于如何检查两个数组是否相等,或者如何检查一个数组是否只包含零?这是两个不同的问题,后者简单地用
buf.allSatisfy( { $0 == 0 })完成。 -
请修正标题,因为它与实际问题有关。
-
问题是关于平等以及如何优化我的代码以实现快速执行。我选择“零”示例只是为了让一切尽可能简单。我猜你的答案是
2. for dig in self.eui where dig != 0 { return false } return true的另一种变体 -
你是如何测试的?你还记得只使用发布版本吗?你在设备上测试过吗?你是怎么测量的?只是检查一下,但我了解到,当人们声称他们测试了某些东西的性能时,他们不会自动相信,因为他们有时不知道如何。
-
我写了一个 XCTest,同时我循环了提到的属性/函数 10,000,000 次。测试是在我的本地开发机器(Intel 64bit i5)上执行的。测试框架在最后给你一个关于执行时间的总结。
标签: arrays swift optimization