I destinati il seguente test:Perché Any è più lento di 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");
I risultati quando null non è presente:
Contains False 00:00:00.0606484
Any == False 00:00:00.7532898
Any object.Equals False 00:00:00.8431783
Quando null è presente elemento 4000:
Contains True 00:00:00.0494515
Any == True 00:00:00.5929247
Any object.Equals True 00:00:00.6700742
Quando null è presente alla elemento 10:
Contains True 00:00:00.0038035
Any == True 00:00:00.0025687
Any True 00:00:00.0033769
Così, quando l'oggetto è vicino alla parte anteriore, Any
è leggermente più veloce; quando è dietro, è molto più lento. Perché?
Sei sicuro? Soprattutto se sei su x64, ho il forte sospetto che a meno che non usi una chiusura, quella funzione sarà in linea. –
@Paul: è una chiamata delegata. Se lo vogliono in linea, dovranno generare un codice diverso per ogni chiamata a "Enumerable.Any". Controllerò comunque. –
@Paul: selezionato con .NET 4 Beta 1 x64 Release. Non in linea. –