2013-09-06 12 views
5

Ho letto in CLR tramite C# di Jeffrey Richter che String.ToUpperInvariant() è più veloce di String.ToLowerInvariant(). Dice che questo è dovuto al fatto che FCL utilizza ToUpperInvariant per normalizzare le stringhe, quindi il metodo è ultra-ottimizzato. Eseguendo un paio di test rapidi sulla mia macchina, concordo sul fatto che lo ToUpperInvariant() sia effettivamente leggermente più veloce.Perché ToUpperInvariant() è più veloce di ToLowerInvariant()?

La mia domanda è se qualcuno sa come la funzione è effettivamente ottimizzata a livello tecnico, e/o perché le stesse ottimizzazioni non sono state applicate a ToLowerInvariant() pure.


Per quanto riguarda il "duplicato": La domanda proposta di "duplicare" in realtà non fornisce una risposta alla mia domanda. Comprendo i vantaggi dell'uso di ToUpperInvariant anziché di ToLowerInvariant, ma quello che vorrei sapere è come/perché ToUpperInvariant ha prestazioni migliori. Questo punto non è affrontato nel "duplicato".

+0

Sembra il lavoro per il tuo ildasm o decompilatore preferito. – Romoku

+1

http://stackoverflow.com/questions/2801508/what-is-wrong-with-tolowerinvariant – Dennisch

+0

Entrambi 'ToUpperInvariant()' e 'ToLowerInvariant()' finiscono per chiamare 'InternalChangeCaseString()', quindi la magia deve essere un po ' ottimizzazioni all'interno (o nei metodi chiamati da) quel metodo. –

risposta

3

Dato che ora è più semplice per read the CLR source which implements InternalChangeCaseString, possiamo vedere che per lo più chiama alla funzione Win32 LCMapStringEx. Sembra che non ci siano note o discussioni sulle prestazioni del passaggio in LCMAP_UPPERCASE rispetto a LCMAP_LOWERCASE per il parametro dwMapFlags. La chiamata a InternalChangeCaseString utilizza una bandiera isToUpper che, se true può comportare un'ottimizzazione migliore da parte del compilatore (o JITter), ma poiché la chiamata a LCMapStringEx deve impostare ap/invocare il frame di chiamata e la chiamata stessa deve funzionare, io non sono lì si risparmia un sacco di tempo.

Forse la raccomandazione è una sospensione da qualche altra implementazione, ma non riesco a vedere nulla che possa fornire un significativo vantaggio di velocità in un modo o nell'altro.