Сегодня я перенес свой старый тест памяти
от Borland C ++ Builder 5.0 в BDS2006 Turbo C ++ и обнаружил странную вещь.
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
заявка
я узнал что wndproc
в BDS2006 :: VCL invalidates
КЭШs.
Я пытался переопределить wndproc
от winapi
за Application->Handle
это легко, но это не останавливает обработку сообщений для Form
, Когда я пытался Form1->Handle
как окно error 1400
происходит (недопустимый дескриптор окна)
Я пытался переопределить wndproc
по VCL
для применения TApplication events
и для Form
переопределением виртуального wndproc
член. Обработка сообщений останавливается, но их вызывающие последовательности остаются, и проблема также не решается.
Итак, мой вывод после устранения всех возможностей, которые я могу придумать, заключается в том, что мне нужно промыть КЭШ как-то интенсивнее после установки процесса / потока для бенчмаркинга.
В DOS Я бы сделал это по одной инструкции, но по окна это более сложно. Ну, предыдущая версия теста памяти использовала только заполнение памяти, которого явно недостаточно для BDS2006 EXE. Я думаю, что инструкция КЭШ Эта проблема связана не с кешем данных, поэтому я немного ее изменил, и в конце концов все получилось.
Очистка кэша процессора:
for (DWORD i=0;i<(128<<20);i+=7)
{
dat[i]+=i;
dat[i]*=i;
dat[i]&=i;
}
Где дата 128MB
выделенный блок памяти (или больше) и должен быть выполнен после всех изменений приоритета процесса / потока и сходства или всех WinAPI звонки до бенчмаркинга.
Других решений пока нет …