ILSpy mostra che String.IsNullOrEmpty
è implementato in termini di String.Length
. Ma allora perché è String.IsNullOrEmpty(s)
più veloce di s.Length == 0
?Perché String.IsNullOrEmpty è più veloce di String.Length?
Per esempio, è 5% più veloce in questo benchmark:..
var stopwatches = Enumerable.Range(0, 4).Select(_ => new Stopwatch()).ToArray();
var strings = "A,B,,C,DE,F,,G,H,,,,I,J,,K,L,MN,OP,Q,R,STU,V,W,X,Y,Z,".Split(',');
var testers = new Func<string, bool>[] { s => s == String.Empty, s => s.Length == 0, s => String.IsNullOrEmpty(s), s => s == "" };
int count = 0;
for (int i = 0; i < 10000; ++i) {
stopwatches[i % 4].Start();
for (int j = 0; j < 1000; ++j)
count += strings.Count(testers[i % 4]);
stopwatches[i % 4].Stop();
}
(altri benchmark mostrano risultati simili Questo minimizzata l'effetto di cruft in esecuzione sul mio computer anche, per inciso, i test a confronto a stringhe vuote è uscito lo stesso a circa il 13% più lento di IsNullOrEmpty
.)
Inoltre, perché è solo più veloce IsNullOrEmpty
su x86, considerando che, il 64 String.Length
è circa il 9% più veloce?
Aggiornamento: Dettagli di configurazione test: .NET 4.0 in esecuzione su Windows 7 a 64 bit, processore Intel Core i5, progetto console compilato con "Codice ottimizzato" abilitato. Tuttavia, è stata abilitata anche l'opzione "Sopprimi l'ottimizzazione JIT sul carico del modulo" (vedere risposta e commenti accettati).
Con ottimizzazione completamente abilitata, Length
è circa il 14% più velocemente rispetto IsNullOrEmpty
con il delegato e costo computazionale rimosso, come in questo test:
var strings = "A,B,,C,DE,F,,G,H,,,,I,J,,K,L,MN,OP,Q,R,,STU,V,,W,,X,,,Y,,Z,".Split(',');
int count = 0;
for (uint i = 0; i < 100000000; ++i)
count += strings[i % 32].Length == 0 ? 1 : 0; // Replace Length test with String.IsNullOrEmpty
Senza conoscere la situazione esatta in cui ci si trova, sono abbastanza fiducioso che nella maggior parte delle situazioni ci sono altre ottimizzazioni per agonizzare anziché il modo più rapido per verificare se una stringa non contiene dati. – Andrew
@minitech Perché ci sono 4 tester e li sta cronometrando in modo indipendente. –
Come 'Empty' e' == 'confronta con' Length' e 'IsNullOrEmpty'? –