2010-10-28 20 views
16

我有列表有150K元素。工作的平均時間IndexOf()比Contains()低4倍。我試圖使用int列表。對於字符串列表IndexOf有點快。爲什麼列表<T> .IndexOf()快了很多比列表<T>。載有()?

我發現只有一個主要的區別,它的屬性TargetedPatchingOptOut。 MSDN告訴:

指示該屬性所應用到的.net框架類文庫的方法是不可能被釋放服務的影響,並且因此可享有橫跨機映像生成器(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

什麼是在這種情況下,數據的? – 2010-10-28 05:14:12

+0

而且不 - 我不認爲這個屬性與它有任何關係。 – 2010-10-28 05:15:00

+0

我使用int和string,行爲是一樣的。 – 2010-10-28 05:16:26

回答

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大小的一組數據

+0

有趣。這種差異背後的推理是什麼? – Thilo 2010-10-28 05:27:30

+0

我真的不知道如何;事實上,他們似乎不太可能會有所不同,我幾乎沒有檢查他們用來測試平等的方法。 – 2010-10-28 05:29:11

+0

你不期望'IEquatable'會更快嗎?另外x4的差異似乎相當多。 – Kobi 2010-10-28 05:29:28

相關問題