Бенчмаркинг, на который влияет VCL

Сегодня я перенес свой старый тест памяти

от Borland C++ Builder 5.0 до BDS2006 Turbo C++ и обнаружил странную вещь.

  • exe от BCB5 работает нормально и стабильно
  • exe из BDS2006 измерить OK только до запуска главной формы (внутри ее конструктора) и если эталонный тест запускается снова после того, как основная форма Activated или даже после любого изменения компонента VCL (например, Caption основной формы), то скорость потока тестов сильно зависит.

Тест памяти VCL

После некоторых исследований я узнал, что:

  • Не имеет значения, если тест находится внутри потока или нет.
  • Приоритет процесса / потока, сходство также не влияет на это.
  • Скрыть любое окно (Visibility,Enabled) не влияет на это.
  • вызвать тестовую форму OnIdleEvent не влияет на это
  • не имеет значения, если время измеряется RDTSC или же PerformanceCounter

Мой вывод заключается в том, что библиотека VCL выполняет некоторый код / ​​поток в фоновом режиме, поэтому мои вопросы:

  1. Есть ли способ временно приостановить код / ​​материал VCL?

    идеальное что-то вроде Application->Pause(); а также Application->Resume(); или просто Forms,

  2. Что еще может вызвать такое поведение и как его избежать?

PS.

Тестовое приложение не имеет компонентов VCL, кроме основной формы. Бенчмарк - это всего лишь несколько передач памяти rep stosd с разными размерами блоков (без смешных вещей). Источник в этом связанном Q / A. Я знаю, что BDS2006 устарел, но сейчас я не ищу обновлений, поэтому, пожалуйста, пропустите любые комментарии о том, что они не являются полными справки.

Проверено на Windows7 Pro x64, 32bit заявка

1 ответ

Решение

Я узнал что wndproc в BDS2006::VCL invalidates КЭШ

  1. Я пытался переопределить wndproc от winapi

    за Application->Handle это легко, но это не останавливает обработку сообщений для Form, Когда я пытался Form1->Handle как окно error 1400 происходит (недопустимый дескриптор окна)

  2. Я пытался переопределить wndproc по VCL

    для применения TApplication events и для Form переопределением виртуального wndproc член. Обработка сообщений останавливается, но их вызывающие последовательности остаются, и проблема также не решается.

Итак, мой вывод после исключения всех возможностей, которые я могу придумать, заключается в том, что мне нужно как-то интенсивнее очищать CACHE после установки процесса / потока для бенчмаркинга.

В DOS я бы сделал это по одной инструкции, но на Windows это сложнее. Ну, предыдущая версия теста памяти использовала только заполнение памяти, которого явно недостаточно для BDS2006 exe. Я думаю, что инструкция CACHE связана с этой проблемой, а не с кешем данных, поэтому я немного ее изменил, и в конце концов все получилось.

Очистка кэша процессора:

for (DWORD i=0;i<(128<<20);i+=7)
    {
    dat[i]+=i;
    dat[i]*=i;
    dat[i]&=i;
    }

Где дата 128MB выделенный блок памяти (или больше) и должен выполняться после всех изменений приоритета процесса / потока и сродства или всех вызовов winapi перед сравнительным тестированием.

Другие вопросы по тегам