在C#中使用Array.GetLength(dimension)时,实际上是在每次调用数组时实际计算出数组的大小,还是缓存/存储了数组的大小并且只访问了该值?

我真正想知道的是,如果将局部变量设置为数组的维数长度,如果在大循环中使用它,或者我可以反复调用array.GetLength()而不会提高速度,是否会提高效率?惩罚。

最佳答案

在这里自己开始缓存/优化无疑是一个坏主意。

处理数组时,必须遵循(JIT)优化器可以识别的标准路径。如果这样做,不仅会缓存Length属性,更重要的是,可以在循环之前进行一次index bounds-check。

当优化器丢失您的跟踪记录时,您将支付每次访问范围检查的罚款。

这就是为什么锯齿状数组(int[][])比多维度数组(int[,])更快的原因。缺少int[,]的优化。无论如何,直到Fx2,我都没有在Fx4中检查此状态。

如果您想进一步研究,建议的缓存通常称为'hoisting'Length属性。

关于c# - C#中的Array.GetLength(dimension)实际如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3176288/

10-11 16:14