16

150K の要素を持つ List があります。平均作業時間 IndexOf() は、Contains() の 4 分の 1 です。intのListを使ってみました。文字列のリストの場合、IndexOf の方が少し高速です。

主な違いは 1 つだけ見つかりました。それは属性 TargetedPatchingOptOut です。MSDN は次のように述べています。

この属性が適用される .NET Framework クラス ライブラリ メソッドがサービス リリースの影響を受ける可能性は低いため、Native Image Generator (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>.IndexOfhttp://msdn.microsoft.com/en-us/library/e4w08k17.aspxを使用EqualityComparer<T>.Default

List<T>.Containshttp://msdn.microsoft.com/en-us/library/bhkz42b3.aspxを使用IEquatable<T>.Equals

最後に等しいかどうかを判断するために同じメソッドを呼び出すことになったとしても (ここでは確かにそうです)、そこにたどり着くまでに別のルートをたどっているので、おそらくそれは間違いです。

「4倍の違い」が実際のケースではないように思われることを考えると、特に150kサイズのデータ​​セットでは、いくつかのオフハンドボクシングが何らかの違いを説明する可能性があります

于 2010-10-28T05:22:21.330 に答える