为什么List <T> .IndexOf()比List <T> .Contains()要快得多?

Pav*_*sov 16 .net contains list indexof

我有List有150K元素.平均工作时间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;
Run Code Online (Sandbox Code Playgroud)

编辑2:

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

And*_*ber 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

即使他们最终调用相同的方法来确定平等(就像这里的情况一样),他们也会采取不同的路线来到达那里,所以这可能会“解释它”。

鉴于“4 倍差异”似乎并非实际情况,一些临时拳击可能会造成一些差异,特别是对于 150k 大小的数据集