我有一个有150K元素的List。平均工作时间IndexOf()比Contains()低4倍。我试着使用List of int。对于字符串列表,IndexOf要快一点。
我发现只有一个主要区别,它的属性为TargetedPatchingOptOut。 MSDN告诉:
表示应用此属性的.NET Framework类库方法不太可能受到服务版本的影响,因此有资格在本机映像生成器(NGen)映像中内联。
此属性可能是此类行为的原因吗?为什么方法Contains()没有这样的属性?
提前致谢。
修改
我的代码是这样的:
List<int> list = CommonHelper.GetRandomList(size);
long min = long.MaxValue;
long max = 0;
long sum = 0;
foreach (var i in list)
{
m_stopwatch.Reset();
m_stopwatch.Start();
list.Contains(i); // list.IndexOf(i);
m_stopwatch.Stop();
long ticks = m_stopwatch.ElapsedTicks;
if (ticks < min)
min = ticks;
if (ticks > max)
max = ticks;
sum += ticks;
}
long averageSum = sum / size;
编辑2:
我编写了与IndexOf()相同的代码,它的工作速度比Contains()慢。
答案 0 :(得分:4)
根据他们的MSDN条目,他们各自到达确定相等性的方法。查看每个条目的“备注”:
List<T>.IndexOf
使用EqualityComparer<T>.Default
http://msdn.microsoft.com/en-us/library/e4w08k17.aspx
List<T>.Contains
使用IEquatable<T>.Equals
http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx
即使他们最终调用相同的方法来确定最终的相等性(这里肯定是这种情况),他们也会采取不同的路线来实现目标,所以这可能会“sp”。
鉴于“4x差异”似乎不是实际情况,一些非正式拳击可能会造成一些差异,特别是对于150k大小的数据集