6

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

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


关于“重复”:提议的“重复”问题确实没有为我的问题提供答案。我了解使用ToUpperInvariantinstead of的好处ToLowerInvariant,但我想知道的是如何/为什么ToUpperInvariant表现更好。这一点在“重复”中没有提到。

4

1 回答 1

3

由于现在更容易阅读实现的 CLR 源代码InternalChangeCaseString,我们可以看到它主要调用 Win32 函数LCMapStringEx。似乎没有关于传入LCMAP_UPPERCASE与参数LCMAP_LOWERCASE的性能的注释或任何讨论。dwMapFlags调用InternalChangeCaseString使用一个标志isToUpper,如果true可能会导致编译器(或 JITter)更好地优化,但由于调用LCMapStringEx必须设置 ap/invoke 调用框架并且调用本身必须工作,我不确定很多时间保存在那里。

也许该建议是对其他一些实现的保留,但我看不到任何可以以一种或另一种方式提供显着速度优势的东西。

于 2016-03-01T01:44:56.127 回答