#c# #performance #datagridview #insert-update
#c# #Производительность #datagridview #вставить-обновить
Вопрос:
Я использую DataGridView для отслеживания событий ввода-вывода. Каждый раз, когда происходит новое событие ввода-вывода, DataGridView заполняется новым элементом, содержащим временную метку среди других данных. Эти обновления приходят каждые 10 мс, и я хочу разместить новые элементы в верхней части сетки.
Мне нужно всего лишь сохранить ~ 100 строк в сетке; более старые следует отбросить, чтобы не использовать память. Все мои попытки оказались слишком медленными, есть ли у вас какие-либо идеи о том, как подойти к этому?
Ответ №1:
Отображение тикающих данных — довольно сложная задача. Одним из важнейших шагов по повышению производительности может быть снижение частоты обновления до числа, распознаваемого человеческим глазом — 20 обновлений в секунду без реакции на каждое событие ввода-вывода.
- Создайте или используйте кольцевой буфер для хранения только 100 записей и уменьшения объема GC / памяти.
- Используйте таймер диспетчера и планируйте обновление сетки каждые 50 мс. По истечении таймера извлеките данные из буфера в предварительно выделенную коллекцию и полностью обновите сетку.
Затем вы можете еще больше улучшить реализацию, оптимизировав шаг 2 — скажем, уменьшив количество ячеек.
Комментарии:
1. Итак, я создал кольцевой буфер, который реализует IList<T>, ICollection<T>, IEnumerable<T> и IEnumerable . Однако, когда я привязываю это к DataGridView (через BindingSource), DataGridView отображает свойства кольцевого буфера вместо его элементов. Есть идеи?
2. Я бы просто скопировал состояние RingBuffer в новую коллекцию. «возьмите данные буфера в предварительно выделенную коллекцию и полностью обновите сетку». Привязка к коллекции, которая постоянно меняется в фоновом режиме, не является хорошей идеей.