斯威夫特零检查表现

时间:2016-01-03 20:11:58

标签: ios swift performance instruments

我有一个计算属性,可以进行零检查。

var _textSize: CGSize?
var textSize: CGSize {
    get {
        if _textSize == nil {
            // compute _textSize
        }
        return _textSize
    }
}

在乐器中进行分析时,== nil检查显示为:

Instruments

我相信static == infix<A where ...> (A?, A?) -> Bool是零检查。是这种情况,如果是这样,那么零检查是否昂贵?

1 个答案:

答案 0 :(得分:4)

正确的答案实际上取决于你对“昂贵”的意思。

我的观点

但是,恕我直言,检查某个值是否为nil 是一项昂贵的操作。

它在时间O(1)执行,因此它是一个恒定的时间,并且不会根据其他值增长。 最后,这对CPU来说非常简单。

Class vs Struct

如果计算属性确实属于ClassStruct,我认为存在差异(就所需时间而言)。

<强>类

在第一种情况下(Class),操作系统需要从Heap类的实例中检索,然后检查属性是否为nilHeap位于RAM上,速度很快(但不是设备上最快的内存)。

<强> STRUCT

另一方面,如果我们使用的是Struct,则有关计算属性的数据可在Stack上获得,如果比Heap更快。

总结

所以,最后:

  1. 检查Class的计算属性是nil
  2. 检查Struct的计算属性是nil是否非常快