I designed the following test:
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");
The results when null is not present:
Contains False 00:00:00.0606484
Any == False 00:00:00.7532898
Any object.Equals False 00:00:00.8431783
When null is present at element 4000:
Contains True 00:00:00.0494515
Any == True 00:00:00.5929247
Any object.Equals True 00:00:00.6700742
When null is present at element 10:
Contains True 00:00:00.0038035
Any == True 00:00:00.0025687
Any True 00:00:00.0033769
So when the object is near the front, Any
is slightly faster; when it's at the back, it's much much slower. Why?