Swift点表示法效率

时间:2014-12-13 23:53:21

标签: ios swift

在Swift中,我说在UIView的几个地方使用self.frame。将self.frame存储在变量中并在多个位置使用变量是否更有效?表现或其他方面有什么不同吗?

5 个答案:

答案 0 :(得分:4)

编译器现在非常擅长找到这种类型的局部优化,所以它现在只是一个优化提示。每个级别的间接都会可能招致某种类型的运行时惩罚,但是使用一个好的编译器可能很难说。所以要确保你必须在上下文中运行基准,否则无论如何都可能找到优化。

在Swift的编译语言类型中,如果有的话,我会期望获得最小的收益,所以我可能不会根据本地优化做出决定。尝试查看您的代码,并问自己哪个版本看起来更清晰。对于像单级变量解引用这样简单的事情,我认为这比运行时更重要。如果你经常在某种闭环中执行 ,那么可能存在可衡量的差异,但是你不应该过早地进行优化。

答案 1 :(得分:3)

.frame属性。属性是一种抽象,当你从中读取或写入时发生的事情被从调用者中抽象出来。

.frame这里是Objective-C类UIView的属性,而在Objective-C中,属性只是一对方法(getter-setter对)。调用者不知道这些方法内部发生了什么。它可以从实例变量读取/写入(即合成);或者它可以从其他来源计算它。实际上,UIView的文档表明.frame实际上是从.bounds.center计算出来的,而不是直接存储的。但它实际上是如何实现的是无关紧要的,因为任何调用者都必须假设可以计算属性。

这不是Objective-C类特有的。在纯Swift类中也是如此。调用者不能假定存储属性,除非它是final。仍然可以通过子类中的计算属性覆盖存储的属性。因此,通常,在访问非final属性时,编译器必须假定它可能会被计算。

无论中间代码有多短,都不能假设计算属性的两次访问产生相同的结果。 (例如,我可以有一个返回系统时间的计算属性。)另外,计算属性可能有副作用。因此,计算机无法自由更改属性的访问次数(类似于方法调用)。因此,如果您将点符号写两次,它将访问该属性两次;而如果你只做一次并将其保存在一个变量中,它只需要做一次。因此,访问它一次并将其存储在变量中可能会更有效,如果只是轻微的话。

答案 2 :(得分:1)

将其存储到let变量并从那里引用它的效率是什么。但如果它发生变化,你就无法做到。在这种情况下,可能没有什么比每次获取它更有效。如果 要改变,你当然不能将它存储在任何变量中,因为你要存储的是副本(因为它是一个结构体,而结构体是值类型);当视图框架发生变化时,变量中的值不会改变,因此您最终会得到错误的答案。

然而, 非常有效 不会过早优化 。你在浪费你的时间和精力,而其他所有人都在浪费时间。只需编写您的程序。如果它很慢,那么使用Instruments找出原因。

答案 3 :(得分:0)

self.frame.size.width和其他框架属性都是变量。没有计算来获取数据,因此它不会改变性能以将其存储在另一个变量上或直接使用它们。

答案 4 :(得分:0)

自己测试一下:

  • 使用self.frame
  • 运行您的应用
  • 使用自定义变量运行您的应用。
  • 检查您是否能说出性能上的任何差异。

如果你无法区分,那么他们都是一样的。如果你能分辨出差异,那么使用更快的那个。

我不认为self.frame更快或更慢。它可能更快或更慢,这取决于编译器的作用。

还要确保使用编译器设置为生产构建设置进行测试,而不是调试构建设置。这正是调试构建和生产构建可能相反的领域(I.E.一个可以在生产中更快,另一个可以在调试构建中更快)。

如果我必须做出有根据的猜测,我会说self.frame更快。此外,self.frame将使用更少的RAM,这可能比速度更重要。但在这两方面我都错了。