2017-01-09 3 views
0

Проблема: в MFC мои таблицы и графики (в представлениях) обновляются очень быстро в режиме деблокирования и очень медленны в режиме отладки, до Я начинаю репопуляцию данных (мы запускаем тесты, которые собирать большие наборы данных (10 000 баллов)).MFC C++ CView медленная частота обновления при отладке

Я использую класс CView двумя разными способами.

  1. Я рисую таблицу и график вручную, используя код, который мы создали.
  2. Я использую TableGridView, написанный набором инструментов: http://www.codejock.com/products/toolkitpro/, который имеет собственный класс GridView, который является производным от CView.

Оба способа показывают очень медленную частоту обновления, пока я не начну повторно заполнять графики и таблицы с большими наборами данных.

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

Вопрос: Любые советы о том, как я должен сузить причину такого поведения, будут очень признательны.

+1

[Руководство для начинающих профилирование производительности] (https://msdn.microsoft.com/en-us/library/ms182372. aspx) объясняет, как узнать, где время тратится. Если вы имеете дело с большим количеством небольших распределений памяти, я бы угадал [отладочную кучу] (https://msdn.microsoft.com/en-us/library/974tc9t1.aspx), чтобы компенсировать большую часть разницы. – IInspectable

+1

Я знаю, что если я делаю TRACE внутри цикла (для целей отладки), это может привести к значительному снижению моего пользовательского интерфейса, когда цикл «длинный» (например, 10 000 TRACE). – franji1

+0

Вполне возможно, что вы выполняете некоторые операции с большим количеством вычислений в своей функции OnDraw(). Этот тип кода работает намного быстрее, если скомпилирован без информации об отладке. Операции с библиотекой, системой или операциями ввода-вывода не затрагиваются, например, StretchBlt() считается «медленной» функцией, поскольку она изменяет размер растрового изображения, которое необходимо передать, но компиляция параметров приложения w/debug не замедлит его работу. Я бы сказал, проверьте, выполняете ли вы вычисления в функции OnDtraw(), которые могут быть перемещены где-то в другом месте, например, когда данные изменяются (например, в OnUpdate()), и это требует recalc, а не для каждого запроса на краску. –

ответ

0

Я нашел решение своей проблемы и хотел поделиться ею. В разделе #ifdef _DEBUG нашего кода мы устанавливали флаги с использованием _CrtSetDbgFlag() для выполнения дополнительных проверок памяти в куче. Это значительно замедляло программное обеспечение.

После установки

_CrtSetDbgFlag(_CRTDBG_CHECK_DEFAULT_DF); 

мой код бежал очень быстро в режиме отладки