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

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

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

  • выход из BCB5 работает нормально и стабильно
  • выход из 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 заявка

2

Решение

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

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

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

  2. Я пытался переопределить 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 звонки до бенчмаркинга.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]