Подтвердить что ты не робот

Является ли команда UNIX `time` достаточно точной для тестов?

Скажем, я хотел сравнить две программы: foo.py и bar.py.

Являются ли несколько тысяч прогонов и соответствующие средние значения time python foo.py и time python bar.py достаточными для профилирования и сравнения их скорости?


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

4b9b3361

Ответ 1

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

Однако при бенчмаркинге вы должны следить за переключением контекста. То есть другой процесс может использовать процессор, конкурирующий за процессор с вашим эталоном и увеличивающий время выполнения. Чтобы избежать конкуренции с другими процессами, вы должны запустить такой тест:

sudo chrt -f 99 /usr/bin/time --verbose <benchmark>

sudo chrt -f 99 запускает ваш тест в классе реального времени FIFO с приоритетом 99, что делает ваш процесс приоритетным процессом и избегает переключения контекста (вы можете изменить свой /etc/security/limits.conf, чтобы он не требовал привилегированного процесса для использовать приоритеты в режиме реального времени).

Он также сообщает time все доступные статистические данные, в том числе количество контекстов переключает ваш результат теста, который обычно должен быть 0, в противном случае вам может потребоваться повторить тест.

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

Ответ 2

В настоящее время, imo, нет смысла использовать time для целей бенчмаркинга. Вместо этого используйте perf stat. Это дает вам гораздо более полезную информацию и может повторять процесс бенчмаркинга за определенное количество времени и делать статистические данные о результатах, т.е. Вычислять дисперсию и среднее значение. Это гораздо более надежное и простое в использовании как time:

perf stat -r 10 -d <your app and arguments>

-r 10 будет запускать ваше приложение 10 раз и делать статистику по нему. -d выводит еще несколько данных, таких как промахи в кеше.

Таким образом, хотя time может быть достаточно надежным для долгосрочных приложений, он определенно не так надежен, как perf stat. Используйте это вместо.

Добавление: Если вы действительно хотите использовать time, по крайней мере, не используйте команду bash -builtin, а реальную сделку в режиме подробного использования:

/usr/bin/time -v <some command with arguments>

Выходной сигнал затем, например,:

    Command being timed: "ls"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 1968
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 93
    Voluntary context switches: 1
    Involuntary context switches: 2
    Swaps: 0
    File system inputs: 8
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

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

Ответ 3

Да, time достаточно точен. И вам нужно будет запускать всего дюжину ваших программ (при условии, что прогон длится более секунды или значительная часть секунды - то есть, по крайней мере, более 200 миллисекунд). Конечно, файловая система будет горячей (т.е. Небольшие файлы уже будут кэшироваться в ОЗУ) для большинства прогонов (кроме первого), поэтому учтите это.

причина, по которой вы хотите, чтобы прогон time -d длился несколько десятых секунды, - это точность и гранулярность измерения времени. Не ожидайте меньше сотой секунды точности. (вам нужна специальная опция ядра, чтобы иметь ее в миллисекунду)

Внутри приложения вы можете использовать clock, clock_gettime, gettimeofday, getrusage, times (у них наверняка есть Эквивалент Python).

Не забывайте читать время (7) man page.

Ответ 4

Да. Команда time дает как истекшее время, так и потребляемый CPU. Последнее, вероятно, вам следует сосредоточиться, если вы не делаете много ввода-вывода. Если прошедшее время важно, убедитесь, что система не имеет другого значительного действия во время выполнения теста.