Я заметил, что выполнение разных программ иногда задерживается на полсекунды, когда Windows воспроизводит звук на (по крайней мере, на моих) многоядерных машинах (не в виртуальной коробке). Я проверил 3 различных конфигурации компьютерного оборудования. Также я написал небольшое тестовое приложение на С ++, чтобы воссоздать эту проблему. Он просто вычисляет несколько мегабайт чепухи в памяти и выводит время, затраченное на это. Это делается в цикле, поэтому вы постоянно получаете результаты. Я загрузил эту тестовую программу (включая исходный код для самостоятельной компиляции, например, с GCC 4.7.2 из MinGW, если вы боитесь вредоносных программ в исполняемом файле) сюда: http://daiw.de/share/PrintCalculationTimes.zip
На следующих снимках экрана вы можете видеть, что происходит при воспроизведении звука (через настройки звука на панели управления) во время выполнения программы:
http://daiw.de/share/PrintCalculationTimesWithoutSound.png
http://daiw.de/share/PrintCalculationTimesWithSoundWithAnnotations.png
(Это происходит не с каждым нажатием на кнопку воспроизведения, но с несколькими щелчками довольно легко воспроизвести на моих тестовых ПК.)
Это хорошо известная проблема? Может ли кто-нибудь подтвердить это наблюдение предоставленным мною тестовым примером?
Спасибо за внимание.
Доби
То, что я вижу, это дрожание 16 мс, а не задержка в полсекунды. Кроме того, я вижу это независимо от того, какие звуки воспроизводятся (даже на вашем скриншоте это похоже на случай).
Я был бы действительно удивлен, если бы воспроизведение некоторых звуков не позволило запустить поток (без приоритета фона). Это было бы серьезной проблемой для буквально тысяч компьютерных игр, каждая из которых требует как плавной анимации, так и постоянно играющих звуков.
Учитывая, что 16 мс — это разрешение по умолчанию для таймера, который вы используете в своей системе, результат совсем не удивителен. Это именно то, что вы должны ожидать.
Если что, попробуйте использовать std::chrono::high_resolution_clock
вместо этого, или положить timeBeginPeriod(1)
в начале вашей программы (необходимо -lwinmm
).
(Обратите внимание, что timeBeginPeriod(1)
заставляет планировщик выполнять чаще глобально, не только в вашей программе, и не только на время жизни вашей программы. Если вы используете ноутбук и работаете от батареи, вы можете перезагрузить компьютер после тестирования для экономии заряда батареи. Как правило, можно было бы сбросить до нормального использования endTimePeriod(1)
, но так как уничтожение процесса — единственный способ завершить вашу программу, которая не будет работать.)
Других решений пока нет …