2013-09-06 13 views
5

Ich lese in CLR via C# von Jeffrey Richter, dass String.ToUpperInvariant() schneller ist als String.ToLowerInvariant(). Er sagt, dies liegt daran, dass die FCL ToUpperInvariant verwendet, um Strings zu normalisieren, so dass die Methode ultra-optimiert ist. Ich mache ein paar schnelle Tests auf meiner Maschine, ich stimme zu, dass ToUpperInvariant() tatsächlich etwas schneller ist.Warum ist ToUpperInvariant() schneller als ToLowerInvariant()?

Meine Frage ist, wenn jemand weiß, wie die Funktion tatsächlich auf einer technischen Ebene optimiert ist, und/oder warum die gleichen Optimierungen nicht auch auf ToLowerInvariant() angewendet wurden.


In Bezug auf die „Duplikat“: Die vorgeschlagene „Duplikat“ Frage nicht wirklich eine Antwort auf meine Frage geben. Ich verstehe die Vorteile der Verwendung von ToUpperInvariant anstelle von ToLowerInvariant, aber was ich gerne wissen würde ist, wie/warum ToUpperInvariant besser funktioniert. Dieser Punkt wird im "Duplikat" nicht angesprochen.

+0

Sieht aus wie der Job für Ihre freundliche ildasm oder Lieblings-Decompiler. – Romoku

+1

http://StackOverflow.com/Questions/2801508/what-is-wrong-with-tolowerinvariant – Dennisch

+0

Sowohl "ToUpperInvariant()" als auch "ToLowerInvariant()" enden beim Aufrufen von 'InternalChangeCaseString()', also muss die Magie etwas sein Optimierungen innerhalb (oder in Methoden, die von dieser Methode aufgerufen werden). –

Antwort

3

Da es jetzt einfacher ist, read the CLR source which implements InternalChangeCaseString, können wir sehen, dass es meist auf die Win32-Funktion LCMapStringEx aufruft. Es scheint keine Notizen oder Diskussionen über die Leistung der Weitergabe in LCMAP_UPPERCASE vs LCMAP_LOWERCASE für die dwMapFlags Parameter zu geben. Aufruf InternalChangeCaseString verwendet ein Flag isToUpper, die, wenn true kann zu einer besseren Optimierung durch den Compiler (oder JITter) führen, aber da der Aufruf an LCMapStringEx muss Setup/Aufruf Call-Frame und der Aufruf selbst zu tun hat, bin ich nicht Sicher ist dort viel Zeit gespeichert.

Vielleicht ist die Empfehlung ein Rückhalt von einer anderen Implementierung, aber ich kann nichts sehen, das einen signifikanten Geschwindigkeitsvorteil auf die eine oder andere Weise bieten würde.

Verwandte Themen