【问题标题】:What order of time does the .NET System.String.Length property take?.NET System.String.Length 属性的时间顺序是什么?
【发布时间】:2010-05-14 17:28:41
【问题描述】:

有人建议我避免重复调用String.Length,因为每次调用它都会重新计算。我曾假设 String.Length 在 O(1) 时间内运行。 String.Length 比这更复杂吗?

【问题讨论】:

  • 我相信您是在询问 .NET System.String.Length 属性,因为 C# 中没有这样的属性。
  • John Saunders:是的,我的意思是 System.String.Length。感谢您的修复。有什么特别的理由说全名 (System.String.Length) 而不仅仅是 String.Length?编辑:哦,我想你的意思是因为 System.String 是 .NET 的一部分,而不是 C# 语言。
  • 访问 String.Length 比访问局部变量慢很多。如果你有一个紧密的循环,你要访问它数十亿次并且你想剃掉几秒钟,你才应该担心它。在我的机器上,string.Length 和局部变量之间的差异约为 1.4 纳秒。字符串是 50 个字符还是 5000 万个字符都没有区别。

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


【解决方案1】:

这是个坏建议 - String.Length 确实是 O(1)。它不像 C 语言中的 strlen

诚然,据我所知,the docs 中的 保证,但字符串的不变性使得 O(1) 变得非常愚蠢 . (不仅是 O(1),而且是一个非常快速的恒定时间。)

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

【讨论】:

  • 我真的会先看看上下文,说调用不必要地处于循环中,有数百万次迭代......总的来说,在这些情况下,不调用属性只是一个好习惯如果整个循环都相同。
  • @Freddy:我不同意 - 如果它是最简单的代码并且它正在评估一个非常简单的属性,它将被内联,我宁愿这样做而不是引入一个临时局部变量。在某些情况下(数组长度),JIT 使用该属性比使用临时本地... 更好
  • @Freddy Rios,我不知道,但编译器知道字符串是不可变的并相应地优化代码不会感到惊讶。我认为,对于编译器来说,这将是一个相当容易的优化。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 如果该方法需要 O(1) 时间,这并不能回答问题 - 例如,该方法仍然可能是 O(n)。
    【解决方案4】:

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

    为了更进一步,根据 .net 框架设计指南,本质上非常静态且非易失性的对象的属性将被设计为属性。如果该属性具有易失性,需要在每次调用时重新计算,则应将其作为方法提供。

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

    【讨论】:

      【解决方案5】:

      正如其他人所说,String.Length 是一个常量属性。如果您真的关心性能(或有重要的迭代),您可以将其值分配给本地整数变量一次,然后多次读取(在循环中等)。这将使优化器有更好的机会将此值分配给 CPU 寄存器。访问属性是比堆栈变量或寄存器更昂贵的操作。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2010-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-06
          • 1970-01-01
          • 2011-02-08
          相关资源
          最近更新 更多