2010-10-23 44 views
1

序言:我正在生產大型數據陣列的重負載應用程序中工作。什麼更快,更方便:散列表或字典<int, double>()?

我寫了下面的類

using System; 
    using System.Collections; 
    using System.Collections.Generic; 

    namespace CSharpSampleApplication.Data.CoreObjects 
    { 
     [Serializable] 
     public class CalcItem 
     { 
      public CalcItem() 
      { 
       _additional = new Hashtable(); 
      } 

      private readonly Hashtable _additional; 

      public bool ContainsKey(int id) 
      { 
       return _additional.ContainsKey(id); 
      } 

      public void Add(int id, double value) 
      { 
       _additional.Add(id, value); 
      } 

      public DateTime Date { get; set; } 

      public object this[int id] 
      { 
       get 
       { 
        return _additional[id]; 
       } 
      } 
     } 


    } 

然後,在另一個類,我做管理器,它包含以下內容:

public List<CalcItem> CalcItems{ get; private set;} 
    private readonly Dictionary<string, int> _keys; 
    private int _index; 
    private readonly object _lock = new object(); 

    public int GetIndex(string key) 
    { 
     lock (_lock) 
     { 
      if (_keys.ContainsKey(key)) 
       return _keys[key]; 
      else 
      { 
       _index++; 
       _keys.Add(key, _index); 
       return _index; 
      } 
     } 
    } 

通過使用這些類我記錄一些實時數據,例如像這個:

   var clc = new CalcItem(); 
       clc.Date = DateTime.Now; 
       clc.Add(_calcItemManager.GetIndex("testData"), r.Next()/100.00); 
       clc.Add(_calcItemManager.GetIndex("testData1"), r.Next()/100.00); 

       i++; 

       if (i % 25 == 0) 
       { 
        clc.Add(_calcItemManager.GetIndex("testData2"), r.Next()/100.00); 
        clc.Add(_calcItemManager.GetIndex("testData3"), r.Next()/100.00); 
        clc.Add(_calcItemManager.GetIndex("testData4"), r.Next()/100.00); 
        clc.Add(_calcItemManager.GetIndex("testData5"), r.Next()/100.00); 
       } 
       _calcItemManager.Add(clc); 

所以管理器存儲[string key] - [int index] bindings for所有的計算項目。

現在的問題是: 使用Dictionary<int, double>而不是Hashtable()來優化內存使用和更快的性能是更好嗎? 列表項 - 包含約1,000,000記錄 CalcItem.Additional - 含有約5 - 10記錄

回答

5

的obly辦法回答「快」就是時間的它典型的數據。但字典更方便(不需要投)和高效(不裝箱)。

如果數據密鑰連續,但是,它會更好只使用一個List-的雙,並使用密鑰作爲指數(帶偏移,如果你的數據不從0開始)。

+0

最好!雙列表 - 令人難以置信的想法 - 請參閱我的答案和新的CalcItem類!非常感謝。 – skaeff 2010-10-23 08:40:04

1

我認爲接受的答案this StackOverflow question也回答你的問題。

簡而言之,兩種數據結構在大多數情況下都會有非常相似的性能。如果對你很重要,你可以(也應該)測量。

0

Marc Gravell - 一個雙重名單決定!我怎麼會想念那個?內存減少兩倍! 這裏是我的新代碼:

using System; 
    using System.Collections; 
    using System.Collections.Generic; 

    namespace CSharpSampleApplication.Data.CoreObjects 
    { 
     [Serializable] 
     public class CalcItem 
     { 
      public CalcItem() 
      { 
       _additional = new List<double>(); 
      } 

      private readonly List<double> _additional; 

      public bool ContainsKey(int id) 
      { 
       return _additional.Count - 1 >= id; 
      } 

      public void Add(int id, double value) 
      { 
       if(ContainsKey(id)) 
        _additional[id] = value; 
       else 
       { 
        while (!ContainsKey(id)) 
        { 
         _additional.Add(0); 
        } 
        _additional[id] = value; 
       } 
      } 

      public DateTime Date { get; set; } 

      public object this[int id] 
      { 
       get 
       { 
        return _additional[id]; 
       } 
      } 
     } 


    } 
相關問題