Swift 无检查性能
Swift nil check performance
我有一个计算的 属性 执行零检查。
var _textSize: CGSize?
var textSize: CGSize {
get {
if _textSize == nil {
// compute _textSize
}
return _textSize
}
}
在 Instruments 中进行分析时,== nil
检查显示为:
我认为 static == infix<A where ...> (A?, A?) -> Bool
是 nil 检查。是这样吗?如果是这样的话,nil checks 会很贵吗?
正确答案取决于您对 "expensive" 的理解。
我的观点
但是,恕我直言,检查值是否为 nil
不是 昂贵的操作。
它在时间 O(1)
中执行,因此它是一个常数时间,不会根据其他值增长。
最后,对于 CPU.
这是一个非常简单的操作
Class 与结构
我想如果计算出的 属性 确实属于 Class
或 Struct
。
则存在差异(就所需时间而言)
Class
在第一种情况下 (Class
) OS 需要从 Heap
中检索 class 的实例,然后检查 属性 是 nil
。 Heap
位于快速的 RAM 上(但不是设备上最快的内存)。
结构
另一方面,如果我们使用 Struct
,有关计算的 属性 的数据可在 Stack
上获得,如果比 Heap
更快。
总结
所以,总而言之:
- 检查
Class
的计算 属性 是否 nil
是 fast
- 检查
Struct
的计算 属性 是否 nil
非常快
我有一个计算的 属性 执行零检查。
var _textSize: CGSize?
var textSize: CGSize {
get {
if _textSize == nil {
// compute _textSize
}
return _textSize
}
}
在 Instruments 中进行分析时,== nil
检查显示为:
我认为 static == infix<A where ...> (A?, A?) -> Bool
是 nil 检查。是这样吗?如果是这样的话,nil checks 会很贵吗?
正确答案取决于您对 "expensive" 的理解。
我的观点
但是,恕我直言,检查值是否为 nil
不是 昂贵的操作。
它在时间 O(1)
中执行,因此它是一个常数时间,不会根据其他值增长。
最后,对于 CPU.
Class 与结构
我想如果计算出的 属性 确实属于 Class
或 Struct
。
Class
在第一种情况下 (Class
) OS 需要从 Heap
中检索 class 的实例,然后检查 属性 是 nil
。 Heap
位于快速的 RAM 上(但不是设备上最快的内存)。
结构
另一方面,如果我们使用 Struct
,有关计算的 属性 的数据可在 Stack
上获得,如果比 Heap
更快。
总结
所以,总而言之:
- 检查
Class
的计算 属性 是否nil
是 fast - 检查
Struct
的计算 属性 是否nil
非常快