【发布时间】:2020-12-12 15:18:14
【问题描述】:
这是一个幼稚的问题。但仍然在问..考虑以下代码:
func1(obj.state)
func2(obj.state)
func3(obj.state)
func4(obj.state)
用下面的代码替换上面的代码是否有任何性能改进或者根本不重要(现代编译器可以自己优化这些东西..?)。
value = obj.state
func1(value)
func2(value)
func3(value)
func4(value)
如果 state 是一个需要一些时间来计算的大函数,那么第二个代码肯定会有更好的性能。我问的是什么时候它只是一个状态。
我想到这个是因为,在第一种情况下,它首先要转到对象的引用,然后必须转到状态指向的引用。但在第二种情况下,它可以直接转到 value 指向的引用。这是空间和时间的权衡。
这是否因语言而异?
【问题讨论】:
-
大多数编程语言的设计都是为了将访问成员的成本降到最低。一些编译器可能会优化后续访问。唯一确定的方法是分析两段代码,看看哪一个表现更好,如果有的话。
-
它可能因语言而异,但大多数现代编译器都足够聪明,可以优化上面的代码,因为您不断要求相同内存地址的值。
-
另外,除非您确定需要解决的实际性能问题,否则您根本不必担心这一点。
-
这也取决于
obj。编译器能否证明函数不会修改obj.state而其他线程也不会修改?如果obj是一个局部变量,这会更容易。
标签: performance