2014-02-06 2 views
0

У меня есть приложение WPF. Существует несколько окон (каждая из которых работает в своем потоке) 5 - 10 окон. Каждый из них имеет только один значительный контроль (который является сетью данных). Каждая сетка данных имеет 2000-3000 строк и 5 столбцов. Каждая строка данных, привязанная к элементу, и когда свойства элемента изменяются, пользовательский интерфейс сильно меняется (90% изменений - текст, передний план, фон). Во всех окнах есть 1000 изменений в секунду.Производительность на виртуализации WPF

Если я переключу вируализацию на переработку, приложение потребляет на 35-40% меньше памяти.

Однако я предполагаю, что если контейнер arent переработал, код должен работать быстрее (поскольку .NET не требуется повторно связывать контейнеры и переоценивать dep реквизиты и может быть больше).

Неужели кто-нибудь попытался разобраться в этом подробно?

Есть падение производительности/преимущество при помощи переработки контейнеров (однако маленький это мне нужно знать).

EDIT: Элементы, которые получают обновления, являются видимыми на 95% (другими словами, если строка невидима, вероятность 99% она не будет обновлена). Также содержимое/номер строки сетки никогда не изменяется. В ячейках меняются только текст и цвета. Строки всегда остаются неизменными.

+1

'Спасибо за то, что вы добавили информацию и не сказали мне, что мне это не нужно. ** Преждевременная оптимизация - это корень всего зла **. Я не говорю, что вам это не нужно. Я просто говорю, что если ваше приложение работает нормально, и нет проблемы с производительностью, тогда нет ничего, чтобы оптимизировать –

+0

очень жаль здесь .. но я не просил помочь мне оптимизировать мое приложение .. я бы никогда .. я знаю, как занят вы все .. Я просто спрашиваю, чтобы я знал .. спасибо снова –

ответ

2

Тот факт, что вы используете память на 1/3 меньше, вероятно, приведет к повышению производительности сам по себе из-за лучшего использования кэша памяти и меньше сбора мусора.

Кроме того, если набор данных с более чем 2000 строк не виртуализирован, обновление для любой из этих строк должно быть распространено на представление. Если он виртуализирован, необходимо обновлять только строки, видимые на экране (и некоторые строки буфера) при изменении.

Заполнение 2000 строк потребует времени. При виртуализации при заполнении данных необходимо заполнять только несколько строк, остальные строки заполняются при прокрутке. Если он не виртуализирован, при прокрутке нужно выполнять меньше работы, но при инициализации необходимо выполнить больше операций.

Но настоящий вопрос: есть ли дополнительная работа при прокрутке видимой видимости? Сколько кадров в секунду вы получаете при прокрутке? Вы видите медленные обновления пользовательского интерфейса? Если нет, виртуализируйте.

Это классический компромисс между использованием памяти и использованием ЦП, между быстрой инициализацией и несколько более медленной прокруткой, с одной стороны, и медленной инициализацией и более быстрой прокруткой с другой.

Сравните и измерьте и посмотрите, что лучше всего подходит для вас.

+0

Если бы я мог. Нет никакого компромисса, потому что у меня достаточно памяти, но всего 8 ядер процессора. Элементы, которые получают обновления на 95%, видны, поэтому аргумент об обновлениях сетки за пределами видимой области недействителен в моем случае. Также содержимое/номер строки сетки никогда не изменяется. В ячейках меняются только текст и цвета. ряды всегда остаются неизменными –

+0

P.S. там также не так много сбора мусора. Приложение довольно статично в памяти ... –

+0

Я согласен с Крисом. Повторная оценка dp - это только одна сторона уравнения.Стандартный режим будет оказывать большее давление на GC и вызывать чрезмерную фрагментацию кучи. –

Смежные вопросы