Бенчмаркинг, на который влияет VCL
Сегодня я перенес свой старый тест памяти
от Borland C++ Builder 5.0 до BDS2006 Turbo C++ и обнаружил странную вещь.
- exe от BCB5 работает нормально и стабильно
- exe из BDS2006 измерить OK только до запуска главной формы (внутри ее конструктора) и если эталонный тест запускается снова после того, как основная форма
Activated
или даже после любого изменения компонента VCL (например,Caption
основной формы), то скорость потока тестов сильно зависит.
После некоторых исследований я узнал, что:
- Не имеет значения, если тест находится внутри потока или нет.
- Приоритет процесса / потока, сходство также не влияет на это.
- Скрыть любое окно (
Visibility,Enabled
) не влияет на это. - вызвать тестовую форму
OnIdleEvent
не влияет на это - не имеет значения, если время измеряется
RDTSC
или жеPerformanceCounter
Мой вывод заключается в том, что библиотека VCL выполняет некоторый код / поток в фоновом режиме, поэтому мои вопросы:
Есть ли способ временно приостановить код / материал VCL?
идеальное что-то вроде
Application->Pause();
а такжеApplication->Resume();
или простоForms
,Что еще может вызвать такое поведение и как его избежать?
PS.
Тестовое приложение не имеет компонентов VCL, кроме основной формы. Бенчмарк - это всего лишь несколько передач памяти rep stosd
с разными размерами блоков (без смешных вещей). Источник в этом связанном Q / A. Я знаю, что BDS2006 устарел, но сейчас я не ищу обновлений, поэтому, пожалуйста, пропустите любые комментарии о том, что они не являются полными справки.
Проверено на Windows7 Pro x64, 32bit
заявка
1 ответ
Я узнал что wndproc
в BDS2006::VCL invalidates
КЭШ
Я пытался переопределить
wndproc
отwinapi
за
Application->Handle
это легко, но это не останавливает обработку сообщений дляForm
, Когда я пыталсяForm1->Handle
как окноerror 1400
происходит (недопустимый дескриптор окна)Я пытался переопределить
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 перед сравнительным тестированием.