ILSpy muestra que String.IsNullOrEmpty
se implementa en términos de String.Length
. Pero entonces ¿por qué es String.IsNullOrEmpty(s)
más rápido que s.Length == 0
?¿Por qué String.IsNullOrEmpty es más rápido que String.Length?
Por ejemplo, es un 5% más rápido en este punto de referencia:..
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();
}
(Otros puntos de referencia muestran resultados similares Éste reduce al mínimo el efecto de la costra que se ejecuta en el ordenador también, como un aparte, las pruebas de comparación a cadenas vacías salieron de la misma en aproximadamente un 13% más lento que IsNullOrEmpty
.)
Además, ¿por qué es IsNullOrEmpty
sólo es más rápido en x86, x64, mientras que en String.Length
es aproximadamente un 9% más rápido?
Actualización: Detalles de configuración de prueba: .NET 4.0 ejecutándose en Windows 7 de 64 bits, procesador Intel Core i5, proyecto de consola compilado con "Código de optimización" habilitado. Sin embargo, "Suprimir la optimización de JIT en la carga del módulo" también se habilitó (ver respuesta aceptada y comentarios).
Con la optimización totalmente habilitado, Length
es aproximadamente un 14% más rápido que IsNullOrEmpty
con el delegado y otra superior eliminado, como en esta prueba:
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
Sin conocer la situación exacta en la que se encuentra, estoy bastante seguro de que en la mayoría de las situaciones hay otras optimizaciones que agonizar en lugar de la forma más rápida de verificar si una cadena no contiene ningún dato. – Andrew
@minitech Porque hay 4 probadores, y los sincroniza de forma independiente. –
¿Cómo se comparan 'Empty' y' == 'con' Length' y 'IsNullOrEmpty'? –