考虑以下内容(不是任何特定语言):
for (i=0; i<list.length(); i++) { ... }
有些人喜欢将其重写为:
int len = list.length()
for (i=0; i<len; i++) { ... }
如果通过list.length()
获取长度不是O(1),那么这是有意义的。但我不明白为什么会出现这种情况。无论数据类型如何,在某处添加长度字段并在大小更改时更新它都应该是微不足道的。
是否存在获取或更新长度不是O(1)的通用数据类型?还是有人想要这样做的另一个原因是什么?
答案 0 :(得分:0)
这是微优化,但是有效的(并不意味着它应该完成,但它可以提高速度 - 最有可能无法察觉的加速)。这是有效的原因是别名。
可以在循环内修改 length
,非侵入式编译器可能无法判断它是否被修改。因此,它必须每次都读取值,而不是在循环之前访问它一次。
如果通过方法调用检索长度,那么差异会更明显 - 就像你在C ++中所做的那样:
int len = vect.size();
答案 1 :(得分:0)
在这种情况下,您直接访问属性,而不是使用getter(函数调用)。这可能总是比方法调用快。即使有方法调用,许多语言都足够智能来优化它。