Performance 何时将长度获取器移出循环才有意义?

Performance 何时将长度获取器移出循环才有意义?,performance,optimization,language-agnostic,Performance,Optimization,Language Agnostic,考虑以下内容(不使用任何特定语言): for(i=0;i这是一个微观优化,但是一个有效的(并不意味着应该这样做,但它可以提高速度-最有可能是不明显的加速)。这是有效的原因是因为混叠 length可以在循环内修改,非侵入式编译器可能无法判断它是否被修改。因此,它必须每次读取值,而不是在循环之前访问一次 如果通过方法调用检索长度,则差异可能更加明显,就像在C++中一样: int len = vect.size(); 在这种情况下,您是直接访问属性,而不是使用getter(函数调用)。这可能总是比方

考虑以下内容(不使用任何特定语言):


for(i=0;i这是一个微观优化,但是一个有效的(并不意味着应该这样做,但它可以提高速度-最有可能是不明显的加速)。这是有效的原因是因为混叠

length
可以在循环内修改,非侵入式编译器可能无法判断它是否被修改。因此,它必须每次读取值,而不是在循环之前访问一次

如果通过方法调用检索长度,则差异可能更加明显,就像在C++中一样:

int len = vect.size();

在这种情况下,您是直接访问属性,而不是使用getter(函数调用)。这可能总是比方法调用快。即使有方法调用,许多语言都足够聪明来优化它。

vector::size()
不是O(1)?@Confluence它没有区别。
int x=y*z;
也是
O(1)
,但它的速度不如
int x=0
(也是
O(1)
)快。一个在1小时内每次运行的程序比一秒钟内每次运行的程序慢,但两者都处于
O(1)
。编译器可能不知道它是否更改,这取决于循环的作用——特别是在调用具有可变长度项的函数时。如果编译器确实知道长度不更改,它还可以展开循环以获得更好的性能。
int len = list.length()
for (i=0; i<len; i++) { ... }
int len = vect.size();