当执行不区分大小写的比较,它是更有效的将字符串转换为大写或小写? 它甚至关系呢?
建议在此SO后 ,C#语言是更有效的与ToUpper的,因为“微软优化的这种方式。” 但是,我也看到了这样的说法 ,在转换ToLower将与ToUpper的取决于你的字符串包含更多的,和通常字符串包含更多的小写字符,这使得ToLower将更有效率。
我特别想知道:
- 有没有一种方法来优化ToUpper的或ToLower将这样一个比其他快?
- 它更快做大写或小写的字符串,为什么之间的区分大小写的比较?
- 是否有任何编程环境(如C,C#,Python和其他),其中一个的情况下显然比其他更好的,为什么?
转换为大写或小写,以不区分大小写的比较是不正确由于某些文化中,特别是土耳其的“有趣”的特点。 相反,使用StringComparer用适当的选项。
MSDN有一些伟大的指导方针上的字符串处理。 您可能还需要检查你的代码通过土耳其测试 。
编辑:请注意周围的顺序不区分大小写的比较尼尔的评论。 这整个领域是比较含糊:(
从微软 MSDN上:
最佳做法在.NET Framework中使用字符串
弦乐使用建议
- 使用String.ToUpperInvariant的方法,而不是String.ToLowerInvariant当你规范化字符串比较方法。
为什么? 从微软 :
规范化字符串为大写
有一个小组转换为小写不能来回时的字符。
什么是例如这样的性格不能来回的?
- 开始 :希腊的Rho符号(U + 03f1)ρ
- 大写:资本希腊的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个字节。 然而,加载时间可能使其不值得的。
为什么你需要知道哪个更快? 除非你做比较的指标buttload,一个正在运行的一对夫妇周期快是无关紧要的整体执行速度,并且听起来像过早的优化:)
微软已经优化ToUpperInvariant()
而不是ToUpper()
不同的是,不变的是更多的文化友好。 如果您需要做的是可能改变的文化字符串大小写不敏感的比较,使用不变,否则不变转换的表现不应该的问题。
我不能说ToUpper的()或者ToLower将()是否虽然速度更快。 我从来没有尝试过,因为我从来没有过的情况下表现要紧那么多。
如果你正在做的在C#中的字符串比较是显著更快地使用.Equals(),而不是两个字符串转换为大写或小写。 使用.Equals()的另一大好处是,更多的内存没有分配给2个新的大/小写的字符串。
这真的不应该以往任何时候都重要。 使用ASCII字符,它绝对没有关系 - 它只是几个比较和任一方向位翻转。 Unicode的可能是一个有点复杂,因为有一些字符,以怪异的方式发生变化的情况下,但确实存在,除非你的文字充满了那些特殊字符应该是没有什么区别。
这样做是正确的,应该有一个小的,微不足道的速度优势,如果你转换为小写,但这是,因为许多已经暗示,文化依赖性和在功能不能继承,但在串你转换(大量的小写字母指一些分配到内存) - 转换为大写是更快,如果你有很多的大写字母的字符串。
这取决于。 如上所述,普通的只有ASCII,其是相同的。 在.NET中,了解并使用String.Compare其正确的国际化的东西(语言文化和Unicode)。 如果你知道输入的情形产生任何东西,使用更常见的情况。
请记住,如果你是做多比较字符串长度是一个很好的第一个鉴别。
如果你正在处理纯ASCII,没关系。 这只是一个或x,32与一个和X,224。 Unicode的,我不知道......