2011-12-21 5 views
5

Я хочу знать количество времени, затрачиваемого на выполнение программы под Linux в микросекундах (или лучшей точности). В настоящее время я использую команду time, но она дает мне максимальную точность в миллисекундах. Есть ли способ настроить команду time, чтобы дать лучшую точность или есть какая-то другая команда для того же самого?время работы микросекунды времени или лучшая точность

ответ

8

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

Добавление большего количества цифр просто добавит шум. Вы также можете вытащить дополнительные цифры от /dev/random.

+0

Я не понимаю вашу точку зрения. Я сказал, что я хочу, чтобы точность была лучше, чем миллисекунды, что невозможно на современных процессорах, где мы можем даже получить точность наносекунд. Как добавление большего количества цифр добавляет больше шума? –

+5

@Guidance Поскольку код, выполняющийся в операционной системе, отличной от реального времени, не имеет детерминированного выполнения. Все, что требуется, - это операционная система для обработки некоторых IP-пакетов или другого произвольного процесса для запуска или пробуждения коллажа, чтобы проверить, нужно ли что-то делать, или файловая система, решающая, должна выписывать грязные страницы и т. Д., И процесс, который вы выполняете время затягивается на некоторое (небольшое количество) время, а тайминги отключены. Встроенные тайминги ОС, такие как время процессора (в отличие от времени настенных часов), также обычно учитываются в временных рядах, которые имеют определенное разрешение (часто 1 галочка ядра, 1 миллисекунда или более) – nos

+0

Быстрые тесты с 'time/bin/sleep 0.006', кажется, указывает, что шум меньше 1 миллисекунды. Поэтому, хотя такие измерения, безусловно, опасны, просьба Гуанидена не является бессмысленной. –

0

Посмотрите, подходит ли current_kernel_time() для вас в соответствии с вашими требованиями. Я использовал его и нашел полезным, поскольку он дает гранулярность наносекундному уровню. Подробнее here.

4

Я согласен с Employed Russian's answer. Не имеет большого смысла хотеть микросекундную точность для таких мер. Таким образом, любая дополнительная цифра, которая у вас есть, бессмысленна (и по существу случайна).

Если у вас есть исходный код приложения для измерения, вы можете использовать функции clock или clock_gettime, но не надейтесь на более чем дюжину микросекунд точности. Существует также инструкция по эксплуатации RDTSC.

Прочитать linux clock howto.

И не забывайте, что время выполнения, с точки зрения приложения, не детерминировано и не воспроизводится (подумайте о переключателях контекста, пропущенных кешках, прерываниях и т. Д.), Происходящих в произвольное время).

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

Если вы хотите измерить время для конкретных функций, научиться profile приложения (gprof, oprofile и т.д. и т.п. ...) Смотрите также this question

Не забудьте прочитать time(7)

Be что на текущем (ноутбук, рабочий стол, сервер) out-of-orderpipelinedsuperscalar процессоры с комплексом CPU caches и TLB и branch predictors, время выполнения некоторой крошечной петли или последовательности машинных команд i s не воспроизводится (количество наносекунд будет варьироваться от одного прогона к другому). И ОС также добавляет случайность (scheduling, context switches, interrupts, page cache,, , demand-paging ...), поэтому не имеет смысла измерять выполнение некоторой команды с более чем одной миллисекундой или, возможно, 100 мкс, если вам повезет, точности. Вы должны сравнивать свою команду несколько раз.

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

Если системы time(1) недостаточно, вы можете сделать собственное измерение; см. также getrusage(2); Я скептически отношусь к тому, что вы принимаете более точные меры.

BTW на моих i3770K недавней GNU/Linux (ядро 4.2, Debian/Sid/x86-64) настольный компьютер, "система" -calls как time(2) или clock_gettime(2) работает в около 3 или 4 наносекунд (благодаря vdso(7), которые позволяют избежать бремя реального syscall ...), чтобы вы могли использовать их внутри вашей программы довольно часто.

2

Использование gettimeofday - дает точность микросекунды

Смежные вопросы