2011-04-21 39 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