.NET System.String.Length属性采用什么时间顺序?

时间:2010-05-14 17:28:42

标签: c# .net string complexity-theory big-o

我有人建议我避免反复拨打String.Length,因为每次我打电话都会重新计算。我假设String.Length在O(1)时间内跑了。 String.Length比那更复杂吗?

6 个答案:

答案 0 :(得分:23)

这是不好的建议 - String.Length确实是O(1)。它与C中的strlen不同。

据我所知,the docs中的{em>保证不是保证,但字符串的不变性使得制作O( 非常愚蠢1)。 (而且不仅仅是O(1),而且非常常数时间。)

坦率地说,如果有人提出这样的建议,我会对他们可能提供的其他建议更加怀疑......

答案 1 :(得分:5)

String.Length是O(1)。人们告诉你不要在循环中调用它的原因是因为它是属性访问,这与方法调用相同。实际上,一个额外的方法调用很少会产生任何显着的差异。

与往常一样,除非您的分析器说它是性能问题的根源,否则不要开始通过代码缓存对String.Length的所有调用。

答案 2 :(得分:3)

回想一下,字符串是不可变的。 System.String.Length永远不会改变。

答案 3 :(得分:2)

正如其他人所说的,String.Length是一个恒定的属性。如果你真的关心性能(或者有重要的迭代),你可以将它的值分配给一个局部整数变量一次,并多次读取(循环等)。这将为优化器提供更好的机会将此值分配给CPU寄存器。访问属性比堆栈变量或寄存器更昂贵。

答案 4 :(得分:1)

不,它不会重新计算。字符串类型是不可变的。

为了更进一步,根据.net 框架设计指南,一个非常静态且非易失性的对象的属性将被设计为属性。如果财产具有易变性,需要在每次通话时重新计算,则应以方法提供。

当您尝试检查某个属性是否需要足够的处理周期来吸引您的注意力时,您可以采用此规则。

答案 5 :(得分:0)

根据内部注释,String.Length属性是一条不运行for循环的指令。因此,它是O(1)操作。