我有一个非常大的数字列表,我想将它传递给一个函数来对其进行一些操作。最初,我创建了一个带有 inout 属性的函数。众所周知,swift 中的 inout 不会通过引用传递,而是对函数进行初始复制,然后在返回时将值复制回。这听起来很昂贵。我决定将我的列表包装在一个类中并通过引用传递,以优化和减少复制时间。有趣的是,似乎 inout 函数比通过引用函数更快。我什至对 inout 变量进行了操作,以使编译器在写入时进行复制。任何想法为什么 inout 函数比通过引用传递更快?
class ReferencedContainer {
var container = [Int:Bool]()
}
func printTimeElapsedWhenRunningCode(title:String, operation:()->()) {
let startTime = CFAbsoluteTimeGetCurrent()
operation()
let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
print("Time elapsed for \(title): \(timeElapsed) s.")
}
func inoutTest(list: inout [Int]?) -> [Int]? {
list![0]=1
return list
}
func refTest(list: ReferencedContainer) -> ReferencedContainer {
list.container[0] = true
return list
}
var list : [Int]? = [Int]()
for i in 0...10000 {
list?.append(i)
}
var ref = ReferencedContainer()
for i in list!
{
ref.container[i] = true
}
printTimeElapsedWhenRunningCode(title: "refTest", operation: { refTest(list: ref)})
printTimeElapsedWhenRunningCode(title: "inout", operation: { inoutTest(list: &list)})
refTest 所用时间:0.0015590190887451172 秒。
输入输出经过的时间:0.00035893917083740234 秒。