Сегодня я портировал свой старый тест памяти
от Borland С++ builder 5.0 до BDS2006 Turbo С++ и обнаружил странную вещь.
- exe из BCB5 работает нормально и стабильно
- exe из BDS2006 измеряет OK только до того, как начнется основная форма (внутри ее конструктора), и если эталонный тест снова запущен после того, как основная форма
Activated
или даже после любого VCLсильная > смена компонента (например,Caption
основной формы), то скорость тестового потока сильно зависит.
После некоторых исследований я узнал, что:
- Не выполняется, если тест внутри нити или нет.
- Приоритет процесса/потока, сродство также не влияют на это.
- Скрыть любое окно (
Visibility,Enabled
) не влияет на это. - вызов тестовой формы
OnIdleEvent
не влияет на это - не выполняется, если время измерено с помощью
RDTSC
илиPerformanceCounter
Мой вывод состоит в том, что библиотека VCL запускает некоторый код/поток в фоновом режиме, поэтому мои вопросы:
-
Есть ли способ временно приостановить VCL-код/материал?
идеально что-то вроде
Application->Pause();
иApplication->Resume();
или простоForms
. -
что еще может вызвать такое поведение и как его избежать?
PS.
В тестовом приложении нет VCL, кроме основной формы. Benchmark - это всего лишь несколько передач памяти rep stosd
с разными размерами блоков (без смешных вещей). Источник находится в этом связанном Q/A. Я знаю, что BDS2006 устарел, но сейчас я не ищу обновления, поэтому прошу прокомментировать любые комментарии о том, что они вообще не помогают.
Протестировано в Windows7 pro x64, 32bit
Приложении