上与下案例

时间:2008-10-24 17:47:35

标签: string language-agnostic uppercase

在进行不区分大小写的比较时,将字符串转换为大写或小写更有效吗?它甚至重要吗?

建议in this SO post C#对ToUpper更有效,因为“Microsoft以这种方式优化了它”。但我也读过this argument,转换ToLower和ToUpper取决于你的字符串包含的内容,并且通常字符串包含更多小写字符,这使得ToLower更有效。

特别是,我想知道:

  • 有没有办法优化ToUpper或ToLower,使得一个比另一个更快?
  • 在大写或小写字符串之间进行不区分大小写的比较是否更快?为什么?
  • 是否存在任何编程环境(例如C,C#,Python等),其中一个案例明显优于另一个案例,为什么?

10 个答案:

答案 0 :(得分:88)

由于某些文化,特别是土耳其的“有趣”特征,转换为大写或小写以进行不区分大小写的比较是不正确的。相反,请使用StringComparer和相应的选项。

MSDN对字符串处理有一些great guidelines。您可能还想检查代码是否通过了the Turkey test

编辑:注意Neil关于序数不区分大小写的比较的评论。整个领域非常模糊:(

答案 1 :(得分:22)

来自MSDN上的Microsoft

  

Best Practices for Using Strings in the .NET Framework

     

字符串使用建议

     

为什么呢?来自Microsoft

  

将字符串规范化为大写

     

有一小部分字符在转换为小写时无法进行往返。

这种不能往返的角色的例子是什么?

  • 开始:希腊语Rho符号(U + 03f1)ρ
  • 大写:大写希腊语Rho(U + 03a1)Ρ
  • 小写:小希腊语Rho(U + 03c1)ρ
  

ρ,Ρρ

这就是为什么,如果您想要进行不区分大小写的比较,则将字符串转换为大写,而不是小写。

答案 2 :(得分:18)

根据MSDN传递字符串并告诉比较忽略大小写更有效:

  

String.Compare(strA,strB,StringComparison.OrdinalIgnoreCase)   相当于(但比更快)调用

     

String.Compare(ToUpperInvariant(strA),ToUpperInvariant(strB),StringComparison.Ordinal)。

     

这些比较仍然很快。

当然,如果你一遍又一遍地比较一个字符串,那么这可能不成立。

答案 3 :(得分:12)

基于倾向于拥有更多小写条目的字符串,ToLower理论上应该更快(很多比较,但很少分配)。

在C中,或者当使用每个字符串中可单独访问的元素(例如C字符串或C ++中的STL字符串类型)时,它实际上是一个字节比较 - 因此比较UPPER与{{1}没有区别}}。

如果您偷偷摸摸并将字符串加载到lower数组中,则可以对整个字符串进行非常快速的比较,因为它可以一次比较4个字节。但是,加载时间可能会让它变得不值得。

为什么你需要知道哪个更快?除非您正在进行公制的比较,否则运行几个周期的速度与整体执行速度无关,并且听起来像是过早优化:)

答案 4 :(得分:6)

Microsoft已优化ToUpperInvariant(),而非ToUpper()。不同之处在于,不变性更具文化友好性。如果您需要对文化中可能不同的字符串进行不区分大小写的比较,请使用Invariant,否则不变的转换性能无关紧要。

我不能说ToUpper()或ToLower()是否更快。我从来没有尝试过,因为我从来没有遇到性能问题那么多的情况。

答案 5 :(得分:4)

如果你在C#中进行字符串比较,那么使用.Equals()而不是将两个字符串转换为大写或小写的速度要快得多。使用.Equals()的另一大优点是没有为2个新的大写/小写字符串分配更多的内存。

答案 6 :(得分:1)

真的不应该重要。对于ASCII字符,它绝对无关紧要 - 它只是一些比较,并且对于任一方向都有点翻转。 Unicode可能有点复杂,因为有些字符会以奇怪的方式改变大小写,但除非你的文字充满了那些特殊字符,否则确实应该没有任何区别。

答案 7 :(得分:1)

做得对,如果转换为小写,应该有一个小的,无关紧要的速度优势,但这是,正如许多人所暗示的,文化依赖并且不是在函数中继承而是在你转换的字符串中继承(很多小写字母意味着对内存的分配很少) - 如果你有一个包含大量大写字母的字符串,转换为大写字母会更快。

答案 8 :(得分:0)

它取决于。 如上所述,只有ASCII,它是相同的。 在.NET中,阅读并使用String.Compare正确的i18n内容(语言文化和unicode)。如果您对输入的可能性有所了解,请使用更常见的情况。

请记住,如果你正在做多个字符串比较,那么长度是一个很好的第一个鉴别器。

答案 9 :(得分:-2)

如果你在处理纯ASCII,那没关系。它只是一个OR x,32与AND x,224。 Unicode,我不知道......