大写与小写
在进行不区分大小写的比较时,将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)时,它实际上是一个字节比较 – 所以比较UPPER
与lower
没有区别。
如果你偷偷摸摸地把你的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,我不知道…