为什么List <t> .IndexOf()要快于List <t> .Contains()?</t> </t>

时间:2010-10-28 05:02:25

标签: .net list contains indexof

我有一个有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()慢。

1 个答案:

答案 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大小的数据集