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

Mat*_*hew 13 .net c# string complexity-theory big-o

我有人建议我避免反复打电话String.Length,因为每次打电话都会重新计算.我原以为String.Length在O(1)时间跑了.是String.Length比这更复杂?

Jon*_*eet 23

这是一个糟糕的建议 - String.Length确实是O(1).它不像strlen在C.

诚然它不保证该文档,据我所知,但字符串的不变性使其成为一个非常愚蠢的事情没有做O(1).(而不仅仅是O(1),但也是一个非常快速的恒定时间.)

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

  • @Freddy:我不同意 - 如果它是最简单的代码并且它正在评估一个非常简单的属性,它将被内联,我宁愿这样做而不是引入一个临时的局部变量.在某些情况下(数组长度),JIT使用属性*比使用临时本地更好*... (6认同)

Mat*_*nen 5

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

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