在进行不区分大小写的比较时,将字符串转换为大写或小写更有效吗?它甚至重要吗?
在这篇SO帖子中建议C#使用ToUpper更有效,因为"Microsoft以这种方式优化了它".但我也读过这个论点,转换ToLower与ToUpper取决于你的字符串包含的内容,并且通常字符串包含更多小写字符,这使得ToLower更有效.
特别是,我想知道:
有没有办法优化ToUpper或ToLower,使一个比另一个更快?
在大写或小写字符串之间进行不区分大小写的比较是否更快?为什么?
是否存在任何编程环境(例如C,C#,Python等),其中一个案例明显优于另一个案例,为什么?
Jon Skeet.. 88
由于某些文化,特别是土耳其的"有趣"特征,转换为大写或小写以进行不区分大小写的比较是不正确的.而是使用具有适当选项的StringComparer.
MSDN 对字符串处理有一些很好的指导.您可能还想检查您的代码是否通过了土耳其测试.
编辑:注意Neil关于序数不区分大小写的比较的评论.整个领域非常模糊:(
由于某些文化,特别是土耳其的"有趣"特征,转换为大写或小写以进行不区分大小写的比较是不正确的.而是使用具有适当选项的StringComparer.
MSDN 对字符串处理有一些很好的指导.您可能还想检查您的代码是否通过了土耳其测试.
编辑:注意Neil关于序数不区分大小写的比较的评论.整个领域非常模糊:(
来自MSDN上的Microsoft:
在.NET Framework中使用字符串的最佳实践字符串使用的建议
在规范化字符串以进行比较时,请使用String.ToUpperInvariant方法而不是String.ToLowerInvariant方法.
为什么?来自微软:
将字符串规范化为大写有一小组字符在转换为小写时无法进行往返.
这样一个不能往返的角色的例子是什么?
开始:希腊Rho符号(U + 03f1)ρ
大写: Capital Greek Rho(U + 03a1)Ρ
小写:小希腊语Rho(U + 03c1)ρ
ρ, Ρ, ρ
这就是为什么,如果您想要进行不区分大小写的比较,则将字符串转换为大写,而不是小写.
根据MSDN,传递字符串并告诉比较忽略大小写更有效:
String.Compare(strA,strB,StringComparison.OrdinalIgnoreCase)相当于(但比其更快)调用
String.Compare(ToUpperInvariant(strA),ToUpperInvariant(strB),StringComparison.Ordinal).
这些比较仍然非常快.
当然,如果你一遍又一遍地比较一个字符串,那么这可能不成立.
基于倾向于具有更多小写条目的字符串,ToLower理论上应该更快(许多比较,但很少分配).
在C中,或者当使用每个字符串中可单独访问的元素(例如C字符串或C++中的STL字符串类型)时,它实际上是一个字节比较 - 所以比较UPPER
没有什么不同lower
.
如果您偷偷摸摸并将字符串加载到long
数组中,您将对整个字符串进行非常快速的比较,因为它可以一次比较4个字节.但是,加载时间可能会让它变得不值得.
为什么你需要知道哪个更快?除非你正在进行公制的比较,否则运行几个周期的速度与整体执行的速度无关,听起来像是过早的优化:)
微软已经优化ToUpperInvariant()
,而不是ToUpper()
.不同之处在于,不变性更具文化友好性.如果您需要对文化中可能不同的字符串进行不区分大小写的比较,请使用Invariant,否则不变的转换性能应该无关紧要.
我不能说ToUpper()或ToLower()是否更快.我从来没有尝试过,因为我从未遇到过性能问题那么重要的情况.