所以我一直主要使用列表從中送入一個Web應用程序,但最近遇到與密鑰,但什麼是產生更多可讀的代碼字典數據庫檢索少量數據僅通過索引/鍵引用時的性能差異?列表VS漢語詞典指數當提到/鍵
我明白,一個字典使用更多的內存,但什麼是最好的做法在這種情況下,是值得的性能/維護權衡記住,我不會被執行搜索或排序的數據承載?
所以我一直主要使用列表從中送入一個Web應用程序,但最近遇到與密鑰,但什麼是產生更多可讀的代碼字典數據庫檢索少量數據僅通過索引/鍵引用時的性能差異?列表VS漢語詞典指數當提到/鍵
我明白,一個字典使用更多的內存,但什麼是最好的做法在這種情況下,是值得的性能/維護權衡記住,我不會被執行搜索或排序的數據承載?
當你想通過找一些列表一個項目,那麼你應該看到所有項目,直到你找到它的關鍵。 我們來看一些基本的例子。你有
Person
{
public int ID {get;set;}
public string Name {get;set;}
}
,你必須收集List<Person> persons
,你想找到一些人的ID
:
var person = persons.FirstOrDefault(x => x.ID == 5);
書面它枚舉整個列表,直到找到該列表中的條目有正確的ID
(條目0是否匹配lambda?否...條目1匹配lambda?No ...等等)。 This is O(n)
。
不過,如果你想通過字典dictPersons發現:
var person = dictPersons[person.ID];
如果你想找到一個辭典鍵某一個元素,它可以立即跳轉到它在字典 - 這是O(1)。 O(n)爲每個人做。 (如果你想知道這是如何完成的 - Dictionary對鍵進行數學運算,將其轉換爲一個值,該值是字典中的一個位置,它與插入時放置的位置相同,稱爲散列函數)
因此,Dictionary
比List
更快,因爲Dictionary不會遍歷所有集合,但Dictionary會從確切位置(散列函數計算此位置)中獲取項目。這是一個更好的算法。
Dictionary
依靠鏈接(維護項目每個哈希表桶的列表)來解決衝突,而Hashtable
碰撞解析使用換湯不換藥(當發生碰撞時,嘗試另一種散列函數映射的關鍵桶)。You can read how hash function works and difference between chaining and rehashing.
除非你真的遇到性能問題和需要優化它的更好的去與什麼是更具可讀性和可維護性。這是因爲你提到它是少量的數據。不誇張 - 有可能在應用程序的整個生命週期中,性能的累積差異(如果有的話)不會等於您通過提高代碼的可讀性而節省的時間。
要正確看待它,請考慮您的應用程序已經這樣做只是爲了讀請求頭和分析意見,並從配置文件中讀取值的工作。不僅列表和字典之間的性能差異很小,而且它也只是應用程序爲服務單個頁面請求而進行的整體處理的一小部分。
即使這樣,如果你看到的性能問題,並優化需要,有可能會是很多其他的優化(如緩存),將做出更大的差異。
您是否需要使用密鑰搜索數據元素? – Steve
爲什麼性能是你的問題? – stuartd
@Steve理想情況下,我想通過一個有意義的值來引用它,例如assetrecord [「assetid」]而不是assetrecord [0],但這是我的場景中的一般做法嗎?這只是一個記錄,所以我不搜索。 – Luke