簡體   English   中英

如何優化使用字典的代碼<string, class>

[英]How to optimize code that uses Dictionary<string, class>

我有以下代碼:

// Dictionary which I want to optimize
Dictionary<string, MyClass> myDict;
//
Dictionary<int, KKSKey> kksKeyList;

...    
...
...

// Classes
[Serializable]
public class MyClass : MyBaseClass
{
    Dictionary<int, DebugValue> myDebugValues;    
    ...
    ...
    ...
}

//
[Serializable]
public class DebugValue
{
    public int ValueType {get;set;}
    public double Value {get;set;}
    ...
    ...
    ...
}

public class KKSKey
{
    public string KKS { set; get; }
    public string Variable { set; get; }
    ...
    ...
    ...
}

我到處都使用字典的原因是因為我需要通過一個鍵來訪問列表。

我在for循環中有以下幾行,其運行時間剛超過550,000次(是!)。 myDict有大約10,000個項目,而kksKeyList有超過550,000個項目。

以下各行針對i = 0 to 550,000

myDict[kksKeyList[i].KKS].myDebugValues[i].ValueType = DOUBLE;
myDict[kksKeyList[i].KKS].myDebugValues[i].Value = tempdouble;

基本上,以上幾行用通過TCP接收的原始數據填充了字典項。 上面的行中的每一個需要每約90-100毫秒for環路(550000倍)。 這對於我的應用程序是不可接受的。 它必須在50毫秒內完成上述行之一。 誰能建議如何優化上述操作的性能? 我願意接受任何建議,即使這意味着在必要時重新定義相關的類。

你可以試試:

string kks = kksKeyList[i].KKS;
myDict[kks].myDebugValues[i].ValueType = DOUBLE;
myDict[kks].myDebugValues[i].Value = tempdouble;

或者可能:

myDict[kksKeyList[i].KKS] = new DebugValue(DOUBLE, tempdouble)

如果適合您的構造函數...

您的時間太慢了。 毫秒是這種問題的永恆,而字典中的550,000個元素就是雞飼料。 我首先想到的是您的問題出在數據源上,而不是字典上。 一毫秒是網絡通信中要花費的大量時間。

如果字典問題,請查看您的記憶。 字典是本質上是數組的哈希表。 創建一個時,它以一定大小的數組開始。 隨着擴展,它將分配一個更大的新數組,並丟棄舊數組。 如果您的550,000個元素的字典以可容納10個元素的空間開頭,則它將使“可用”內存中充滿大塊無法使用的內存,因為下一次分配的空間更大。 GC將努力重新排列內存並使所有這些塊連續,並且如果您在運行兩個問題語句時這樣做,則會減慢速度。 要解決此問題,請在創建字典時為550,000個條目分配空間。 這可能就足夠了,但也可以調用GC.Collect() 這將使GC的工作一目了然,並在需要時為您提供干凈的時間安排。

另一個內存問題可能是myDebugValues 對於myDict中的550,000個條目,您每個都有一個。 就像您希望myDict從一開始就很大一樣,這些也需要很小。 我什至可以建議使用ListDictionary或HybridDictionary( System.Collections.Specialized )。

內存的關鍵是僅使用實際內存,而不是虛擬內存。 一旦您的機器開始分頁,您就會遇到麻煩。 並讓您的GC保持快樂。

希望這會有所幫助,否則別人會提出更好的答案。 (我喜歡Urik,但是優化程序可能已經在這樣做了。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM