2011-04-21 74 views
8

我有這樣的2個例子:DataPointCollection清除性能

1實施例:

Series seria = new Series("name"); 
    for(int i = 0 ; i < 100000 ; i++) 
    { 
     seria.Points.Add(new DataPoint(i, i)); 
    } 

    seria.Points.Clear(); // - this line executes 7.10 seconds !!!!!!!!!! 

Series是從System.Windows.Forms.DataVisualization DLL類

2實施例:

List<DataPoint> points = new List<DataPoint>(); 
    for (int i = 0; i < 100000; i++) 
    { 
     points.Add(new DataPoint(i, i)); 
    } 

    points.Clear(); // - this line executes 0.0001441 seconds !!!!!!!!!! 
  • 爲什麼這些Clear方法之間存在如此巨大的差異?
  • 如何更快地清除seria.Point?

回答

8

這是一個非常著名的問題:http://connect.microsoft.com/VisualStudio/feedback/details/596212/performance-problem-in-mschart-datapointcollection-clear

建議的解決方法是象下面這樣:

public void ClearPointsQuick() 
    { 
     Points.SuspendUpdates(); 
     while (Points.Count > 0) 
      Points.RemoveAt(Points.Count - 1); 
     Points.ResumeUpdates(); 
    } 

固有的,而結算點的數據可視化工具應該已經暫停更新,但它不」牛逼!因此,上述解決方法將比簡單地調用Points.Clear()(當然,直到實際的bug被修復)快上百萬倍。

+0

你爲什麼要'while(Points.Count> 0)...'而不是隻調用'Points.Clear()'?您已經暫停更新,所以這不成問題。 – Andrey 2011-04-21 13:55:47

+4

我不知道Clear()的實現細節,無論是否對ResumeUpdates()或與佈局交互的其他函數有不正確的調用。所以最好避開Points.Clear()直到它被修復(因此_workaround_)。 – 2011-04-21 14:01:41

+0

經過測試後,似乎Points.Clear()確實/ something /並且上面的工作更好 – fbstj 2015-09-23 13:07:11