我通过Jeffrey Richter通过C#在CLR中阅读到String.ToUpperInvariant()
比String.ToLowerInvariant()
更快。他说这是因为FCL使用ToUpperInvariant来规范化字符串,因此该方法是超优化的。在我的机器上运行了几个快速测试,我同意ToUpperInvariant()
确实稍微快一些。
我的问题是,是否有人知道该功能实际上是在技术水平上进行优化的,和/或为什么对ToLowerInvariant()
也未应用相同的优化。
关于“重复”问题:提出的“重复”问题确实无法回答我的问题。我了解使用ToUpperInvariant
而不是ToLowerInvariant
的好处,但是我想知道的是ToUpperInvariant
如何/为什么性能更好。在“重复”中未解决这一点。
最佳答案
由于现在使用read the CLR source which implements InternalChangeCaseString
更加容易,因此我们可以看到它主要调用Win32函数 LCMapStringEx
。对于LCMAP_UPPERCASE
参数传递LCMAP_LOWERCASE
与dwMapFlags
的性能,似乎没有任何注释或讨论。调用InternalChangeCaseString
使用标志isToUpper
,如果true
可能会导致编译器(或JITter)更好地进行优化,但是由于对LCMapStringEx
的调用必须设置ap/invoke调用框架并且调用本身必须起作用,所以我不会确保在那里节省了大量时间。
也许该建议是对其他一些实现的保留,但是我看不到任何能够以一种方式或其他方式提供明显的速度优势的东西。