在循环中执行array.length或list.count是否代价高昂
我知道在JavaScript中,创建一个这样的for循环: for(int i = 0; i < arr.length; i++)
是昂贵的,因为它每次都计算数组长度。 对于列表和数组,这种行为在c#中是否代价高昂。 或者在编译时它是否经过优化? 还有其他语言如Java,这是如何处理的?
它在C#中并不昂贵。 首先,没有“计算”:由于内联,查询长度基本上是一个基本操作。 其次,因为( 根据其开发人员 ),编译器识别这种访问模式,并且实际上将优化任何(冗余)边界检查以访问数组元素。
顺便说一下,我相信对于现代JavaScript虚拟机来说类似的东西也是如此,如果还没有,那么很快就会发生这种情况,因为这是一个微不足道的优化。
-
所有.Net数组都有一个包含数组长度的字段,因此长度不会在使用时计算,而是在创建时计算。
-
.Net虚拟机非常擅长在可能的情况下消除边界检查,这是其中一种情况,其中边界检查移出循环(在大多数情况下,如果不是,它只是2个指令开销)。
编辑:
arrays边界检查消除
几乎在任何语言中,答案都是“它取决于”。
大多数情况下,它取决于编译器是否足够聪明,能够判断在循环中列表或数组的长度是否可能发生变化。
但是,这不太可能由语言规范定义。
因此,可以安全地假设编译可能无法解决这个问题。 如果你真的相信对象的长度不会改变,可以先计算长度并在循环控制结构中使用它。
但要小心其他线程……
如果它像Java一样,它应该是一个O(1)操作。
我发现以下链接很有用: http : //www.devguru.com/Technologies/Ecmascript/Quickref/array.html
它还取决于该getter是进行计算还是访问已知值。
我相信如果你使用Linq Count()扩展方法,那么它可以在每次调用时计算。