Сбор данных для повышения производительности

#c# #collections #mschart

#c# #Коллекции #mschart

Вопрос:

У меня есть эти 2 примера:

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 !!!!!!!!!!
  
  • Почему существует такая огромная разница между этими четкими методами?
  • И как я могу очистить seria.Указать быстрее?

Ответ №1:

Это очень хорошо известная проблема: проблема с производительностью в MSChart DataPointCollection.Очистить()

Предлагаемый обходной путь, как показано ниже:

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

По сути, при очистке точек визуализатор данных уже должен приостановить обновления, но это не так! Таким образом, описанное выше обходное решение будет работать примерно в миллион раз быстрее, чем простой вызов Points.Clear() (конечно, пока не будет исправлена фактическая ошибка).

Комментарии:

1. почему вы сделали бы это while (Points.Count > 0) ... вместо того, чтобы просто вызвать Points.Clear() ? Вы уже приостановили обновления, так что это не будет проблемой.

2. Я не знаю деталей реализации Clear(), имеет ли if неправильный вызов ResumeUpdates() или другой функции, которая взаимодействует с макетом. Поэтому лучше избегать точек. Очищать () до тех пор, пока это не будет исправлено (отсюда и обходной путь ).

3. После тестирования этого, кажется, что указывает. Clear() делает / что-то / и что вышеупомянутое работает намного лучше

4. Эта ссылка для подключения отключена, и, похоже, прямой замены нет. Вопрос OP адекватно описывает проблему. Я полагаю, что страница, которая была на другом конце этой ссылки, возможно, объяснила, почему проблема существует, но кого это волнует, пока это решение работает. Однако было бы неплохо узнать, почему.