2013-08-18 81 views
2

我正在生成<字符串,double>對,並將每個字符串存儲在.NET Dictionary中,如果字符串鍵尚未被使用。有效地添加到C#.NET字典

效率明智,這樣做更好嗎?

try { Dict.Add(key, val); } catch (ArgumentException) {} //blind attempt 

or this?

if (!Dict.ContainsKey(key)) { Dict.Add(key, val); }  //smart attempt 

盲試會觸發dup鍵的例外;智能嘗試點擊兩次字典索引 - 一次檢查,然後再次添加。 (在我的特殊情況下,有10%左右的時間有重複鍵)。

有沒有人知道如果一種方法比另一種方法更優先?

+3

你真的想測試它。我會猜測,聰明的方式運作得更快,但這只是一個猜測。它也將取決於什麼「無數」真的是。 –

回答

5

例外一般are costly

當成員拋出異常,它的性能可以是數量級慢。

這就是說,正如Andrew Barber指出的那樣,這取決於什麼「無數」是什麼,以及您期望碰撞發生的頻率。

雖然你必須測量你的表現,以確定知道,但我個人可能會去檢查等待一個例外,特別是如果你實際上不是任何東西來處理異常,只是計劃吞下它。

3

例外是非常昂貴的效率明智的,我會主張smart approachblind attempt approach。儘可能避免異常。

閱讀True Cost Of Exceptions in .NET以獲取有關低效異常如何的更多信息。

4

異常通常比「以不會導致異常的方式執行」更昂貴。如果你不關心它的值包含在字典中,你可以做到以下幾點,以避免雙重檢查和異常

Dict[key] = val; 
3

使用ConcurrentDictionary<string, double>並使用TryAdd()方法MSDN

1

由於在其他答案中已經提到,異常處理可能會很慢,所以我會選擇ContainsKey檢查。然而,從設計的角度來看,使用異常來控制程序流並不是一個好習慣。一般來說,例外情況應該用於例外情況。

如果您認爲有可能存在重複密鑰,請使用ContainsKey。如果使用相同的密鑰是暗示系統某處發生嚴重故障的事情,那麼異常可能會更有意義(儘管您需要使用它而不是僅僅捕獲它)。