I diseñado el siguiente ensayo:¿Por qué es más lento que contiene?
var arrayLength=5000;
object[] objArray=new object[arrayLength];
for(var x=0;x<arrayLength;x++)
{
objArray[x]=new object();
}
objArray[4000]=null;
const int TestSize=int.MaxValue;
System.Diagnostics.Stopwatch v= new Stopwatch();
v.Start();
for(var x=0;x<10000;x++)
{
objArray.Contains(null);
}
v.Stop();
objArray.Contains(null).Dump();
v.Elapsed.ToString().Dump("Contains");
//Any ==
v.Reset();
v.Start();
for(var x=0;x<10000;x++)
{
objArray.Any(o=>o==null);
}
v.Stop();
objArray.Any(x=>x==null).Dump();
v.Elapsed.ToString().Dump("Any");
//Any Equals
v.Reset();
v.Start();
for(var x=0;x<10000;x++)
{
objArray.Any(obj=>object.Equals(obj,null));
}
v.Stop();
objArray.Any(obj=>object.Equals(obj,null)).Dump();
v.Elapsed.ToString().Dump("Any");
los resultados cuando nulo no está presente:
Contains False 00:00:00.0606484
Any == False 00:00:00.7532898
Any object.Equals False 00:00:00.8431783
Cuando nulo está presente en el elemento 4000:
Contains True 00:00:00.0494515
Any == True 00:00:00.5929247
Any object.Equals True 00:00:00.6700742
Cuando nulo está presente en el elemento 10:
Contains True 00:00:00.0038035
Any == True 00:00:00.0025687
Any True 00:00:00.0033769
Así que cuando el objeto está cerca del frente, Any
es ligeramente más rápido; cuando está atrás, es mucho más lento. ¿Por qué?
¿Estás seguro? Especialmente si está en x64, sospecho que a menos que use un cierre, esa función estará en línea. –
@Paul: es una llamada de delegado. Si quieren alinearlo, tendrán que generar un código diferente para cada llamada a 'Enumerable.Any'. Lo comprobaré sin embargo. –
@Paul: verificado con la versión .NET 4 Beta 1 x64. No está en línea –