什么时候将长度吸气剂移出循环是否有意义?

时间:2012-10-12 23:37:30

标签: performance optimization language-agnostic

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

for (i=0; i<list.length(); i++) { ... }

有些人喜欢将其重写为:

int len = list.length()
for (i=0; i<len; i++) { ... }

如果通过list.length()获取长度不是O(1),那么这是有意义的。但我不明白为什么会出现这种情况。无论数据类型如何,在某处添加长度字段并在大小更改时更新它都应该是微不足道的。

是否存在获取或更新长度不是O(1)的通用数据类型?还是有人想要这样做的另一个原因是什么?

2 个答案:

答案 0 :(得分:0)

这是微优化,但是有效的(并不意味着它应该完成,但它可以提高速度 - 最有可能无法察觉的加速)。这是有效的原因是别名

可以在循环内修改

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

如果通过方法调用检索长度,那么差异会更明显 - 就像你在C ++中所做的那样:

int len = vect.size();

答案 1 :(得分:0)

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