16

我有 List 有 150K 个元素。IndexOf() 的平均工作时间比 Contains() 低 4 倍。我尝试使用 int 列表。对于 List of strings IndexOf 来说要快一些。

我发现只有一个主要区别,它是 TargetedPachingOptOut 属性。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() 慢。

4

1 回答 1

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

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

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

于 2010-10-28T05:22:21.330 回答