.net 为什么列表<;T>;。IndexOf()比List快得多<;T>;。包含()?

.net 为什么列表<;T>;。IndexOf()比List快得多<;T>;。包含()?,.net,list,contains,indexof,.net,List,Contains,Indexof,我有一个包含150K个元素的列表。IndexOf()的平均工作时间比Contains()低4倍。我试着使用int的List。对于字符串的List,IndexOf要快一点 我只发现了一个主要区别,那就是属性TargetedPatchingOptOut。MSDN告诉我们: 指示应用此属性的.NET Framework类库方法不太可能受服务版本的影响,因此有资格跨本机映像生成器(NGen)映像进行内联 这种属性可能是这种行为的原因吗?为什么方法Contains()没有这样的属性 提前谢谢 编辑: 我有

我有一个包含150K个元素的列表。IndexOf()的平均工作时间比Contains()低4倍。我试着使用int的List。对于字符串的List,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;
List List=CommonHelper.GetRandomList(大小);
long min=long.MaxValue;
长最大值=0;
长和=0;
foreach(列表中的变量i)
{
m_秒表。重置();
m_秒表。开始();
list.Contains(i);//list.IndexOf(i);
m_秒表。停止();
长刻度=m_秒表.ElapsedTicks;
如果(滴答声<分钟)
最小=滴答声;
如果(滴答声>最大值)
最大值=滴答声;
总和+=滴答声;
}
长平均总和=总和/大小;
编辑2:


我在IndexOf()中编写了相同的代码,它的工作速度比Contains()慢。

根据MSDN条目,它们在确定相等性的方法上略有不同。在每个条目的“备注”下查看:

List.IndexOf
使用
EqualityComparer.Default

List.Contains
使用
IEquatable.Equals

即使他们最终调用相同的方法来确定最终的平等性(这里的情况肯定是这样),他们也会采取不同的路线来实现这一点,因此可能会“破坏它”


考虑到“4x差异”似乎不是实际情况,一些随意的拳击可能会造成一些差异,特别是对于150k大小的数据集

这种情况下的数据是什么?不-我认为属性与此无关。我使用int和string,行为是一样的。你能为我们做一个简短的重现性测试来展示这种行为吗?Kobi,我在生产中没有这样的列表,我是在玩不同的数据结构时发现的。很有趣。这种差异背后的原因是什么?我真的不知道是什么原因;事实上,它们似乎不太可能会有所不同,我几乎没有检查它们使用了什么方法来测试平等性。但你不认为
IEquatable
会更快吗?另外,x4的差异似乎很大。@Kobi;这些也是我最初的想法。不过,今晚我的头脑太模糊了,不能再挖太多了。heheSorry,但不是:
列表
还使用了
EqualityComparer
——它提供了对
IEquatable
的支持。