Возвращается ли время работы процессора, которое должно быть точно таким же, как и в прогонах?

У меня есть большой проект, написанный на С++. У этого могут быть некоторые проблемы стабильности (например, случайное время выполнения), но я не уверен в этом. Я понимаю, что время выполнения, измеренное временем настенных часов, может отличаться от числа запусков из-за многозадачности ОС. Но я не знаю, нормально ли для стабильной программы, иметь переменное время выполнения, измеренное временем часов процессора между прогонами с одним и тем же входом. Я попытался использовать clock() от time.h и

boost::chrono:::process_user_cpu_clock::now();

Но в обоих случаях я вижу всплески на графике. Я приведу вам пример таких графиков. Здесь Y-ось - время выполнения, ось X - последовательные прогоны одной и той же программы, на одних и тех же входных данных. Красный график - время настенных часов, красное - время работы процессора, взятое clock() от time.h

введите описание изображения здесь

Конечно, мы предполагаем, что наша программа стабильна и не имеет случайного поведения. Так, возможно ли это? Платформа - Windows 7.

Ответ 1

Конечно, мы предполагаем, что наша программа стабильна и не имеет случайное поведение. Итак, возможно ли это?

Если вы работаете на рабочем столе, эта изменчивость типична, и я бы сказал, что это неизбежно. Прерывания, активность канала ввода/вывода и сам Ethernet потребляют время процессора, часто с удивительно большими "блокирами времени" (см. Tcp/ip SAR, промахи в кэше и т.д.), Большинство из которых выходит за рамки вашего программного управления, а не -synch с вашими усилиями времени.

Я видел только один пример программного обеспечения, работающего на "стабильном" уровне, на который вы намекаете. Этот компьютер был SBC (одноплатный компьютер), с 1 процессором (не Intel или AMD), все статические RAM (так что нет динамического ram, и никакой активности обновления), нет Ethernet, но два канала ввода/вывода с фиксированной скоростью, и он запускал одну программу на уменьшенной операционной системе (а не на Linux, а не на рабочем столе os)... точность была такой, как если бы поведение было простой логикой hw.

Как лидер команды, я узнал необычное, поэтому я спросил ее, есть ли у нее время, чтобы подключить логический анализатор и область видимости... она показала, что ни один инструмент не показал разницы во времени, от края до края, сообщения для сообщения. Ее логика программного обеспечения для меня была впечатляюще прямолинейной. В этой системе, если вам не нужно прерывание, вы просто не включили ее.

Рабочий стол - замечательно отличающийся зверь... так много вещей происходит одновременно, большинство из которых нельзя заглушить.


Да. Не только возможно, но и неизбежно, что на рабочем столе есть разновидности (по времени), которые вы видите.

И все же можно добиться стабильности, на которую вы намекали, просто не на рабочем столе. Требуется специальное оборудование и тщательное кодирование.

Ответ 2

OP говорит, что используется Windows 7, если это MSVC, man page говорит

Функция часов указывает, сколько часов настенных часов вызывающий процесс использовал. Обратите внимание, что это не строго соответствует ISO C99, который указывает значение чистого ЦП в качестве возвращаемого значения. Чтобы получить процессорное время, используйте функцию Win32 GetProcessTimes.

Вот почему кажущееся время выполнения непоследовательно.

Ответ 3

Это абсолютно нормально. Это вызывает много эффектов. На самом деле очень трудно добиться повторяемости для экспериментов с производительностью.

Кэш/Память

Любая производительность, связанная с памятью, сильно зависит от того, используется ли кеш или нет:

Операционная система планирует использовать другой поток на вашем ядре? Даже если время этого потока не учитывается для ваших часов процесса, оно может вырезать ваши рабочие данные из кеша, и ваша программа будет работать медленнее после этого.

Операционная система решает переместить поток в другое ядро? Ядро-локальный кеш не содержит ваших рабочих данных. В параллельном приложении сопоставление потоков с ядрами оказывает огромное влияние на производительность.

Операционная система решает запустить другой интенсивный поток памяти параллельно (на другом ядре)? В вашем приложении меньше доступной кэш-памяти и доступной памяти.

Оборудование

В недавней системе вы, вероятно, используете турборежим, который изменяет частоту процессора на основе многих параметров, включая температуру.

Современные процессоры имеют много эвристик, которые влияют на производительность. Например, предсказатель ветки догадывается, какую ветку вы берете за прыжок, основанный на прошлом "опыте". Ваша производительность сильно варьируется, правильно ли это предположение или нет, как подробно объясняется в этом эпическом ответе. Существуют и другие компоненты, например, prefetchers.

Точность часов

Часы также не идеальны. Они имеют ограниченное разрешение и точность. Они могут дрейфовать с течением времени или различаться между ядрами. Как указано Weather Vane, программное обеспечение поверх часов также может быть ошибочным.

Это, безусловно, исчерпывающий список, просто некоторые примеры.