大写与小写

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

在这个SOpost中提出,C#对于ToUpper更有效,因为“微软就是这样优化它的”。 但是我也读过这个观点 ,即ToLower和ToUpper的转换取决于你的string包含了多less,而且通常string包含更多的小写字符,这使得ToLower更有效率。

特别是,我想知道:

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

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

MSDN有一些关于string处理的很好的指导 。 您可能还想检查一下您的代码是否通过了土耳其testing 。

编辑:注意尼尔的评论围绕序号不区分大小写的比较。 这整个领域是相当朦胧:(

根据MSDN ,传递string并告诉比较忽略大小写是更高效的:

String.Compare(strA,strB,StringComparison.OrdinalIgnoreCase)等价于( 但快于 )调用

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

这些比较还是非常快的。

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

从MSDN上的Microsoft :

在.NET Framework中使用string的最佳实践

string使用build议

  • 标准化string进行比较时,请使用String.ToUpperInvariant方法而不是String.ToLowerInvariant方法。

为什么? 来自微软 :

将string标准化为大写

有一小部分人物在转换成小写字母时不能往返。

这样的人物不能往返的例子是什么?

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

ρ, Pρ

这就是为什么,如果你想做大小写不敏感的比较,你把string转换为大写,而不是小写。

基于趋于具有更多小写字母的string,ToLower在理论上应该更快(大量比较,但很less分配)。

在C中,或者当使用每个string的单独可访问的元素(例如Cstring或C ++中的STL的stringtypes)时,它实际上是一个字节比较 – 所以比较UPPERlower没有区别。

如果你偷偷摸摸地把你的string加载到long数组中,你会得到一个非常快的比较整个string,因为它可以一次比较4个字节。 但是,加载时间可能使它不值得。

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

微软已经优化了ToUpperInvariant() ,而不是ToUpper() 。 不同之处在于不变性更加文化友好。 如果您需要对文化中可能有所不同的string进行不区分大小写的比较,请使用Invariant,否则不变转换的性能应该无关紧要。

我不能说ToUpper()或ToLower()是否更快。 我从来没有尝试过,因为我从来没有一个性能重要的情况下。

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

这真的不应该有问题。 对于ASCII字符,这绝对没有关系 – 这只是一些比较,而且对于任何一个方向都有点翻转。 Unicode可能会稍微复杂一点,因为有些字符会以奇怪的方式来改变大小写,但除非您的文本充满了这些特殊字符,否则确实不应该有任何区别。

正确的做法是,如果你转换成小写字母,应该有一个微不足道的速度优势,但是正如许多人所暗示的那样,这是一种文化依赖性,不是在函数中inheritance,而是在你转换的string中(大量小写字母意味着很less的内存分配) – 如果你有一个大量的大写字母的string转换为大写更快。

这取决于。 如上所述,只显示ASCII,其相同。 在.NET中,阅读和使用String.Compare它正确的国际化的东西(语言文化和unicode)。 如果您对input的可能性有所了解,请使用更常见的情况。

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

如果您使用纯ASCII进行处理,则无关紧要。 这只是一个OR x,32与AND x,224。 Unicode,我不知道…

Interesting Posts