为什么ToUpperInvariant()比ToLowerInvariant()更快?

时间:2013-09-06 12:25:14

标签: c# string optimization clr normalization

我通过C#by Jeffrey Richter在CLR中读到String.ToUpperInvariant()String.ToLowerInvariant()更快。他说这是因为FCL使用ToUpperInvariant来规范化字符串,因此该方法是超优化的。在我的机器上运行几个快速测试,我同意ToUpperInvariant()确实稍快一些。

我的问题是,是否有人知道该功能在技术层面上是如何实际优化的,以及/或为什么同样的优化也未应用于ToLowerInvariant()


关于"重复" 建议的"重复"问题真的没有提供我的问题的答案。我理解使用ToUpperInvariant代替ToLowerInvariant的好处,但我想知道的是ToUpperInvariant如何/更好地表现。这一点未在"复制"。

中解决

1 个答案:

答案 0 :(得分:3)

由于read the CLR source which implements InternalChangeCaseString现在更容易了,我们可以看到它主要调用Win32函数LCMapStringEx。对LCMAP_UPPERCASE参数传递LCMAP_LOWERCASEdwMapFlags的效果似乎没有任何说明或讨论。调用InternalChangeCaseString使用标记isToUpper,如果true可能导致编译器(或JITter)更好地进行优化,但由于调用LCMapStringEx必须设置ap /调用呼叫帧并且呼叫本身必须工作,我不确定那里有很多时间被保存。

也许这个建议是其他一些实施方案的延续,但我无法看到任何能够以某种方式提供显着速度优势的东西。