在Swift中,我说在UIView的几个地方使用self.frame。将self.frame存储在变量中并在多个位置使用变量是否更有效?表现或其他方面有什么不同吗?
答案 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,这可能比速度更重要。但在这两方面我都错了。