команда времени linux микросекунды или лучшая точность - PullRequest
5 голосов
/ 21 декабря 2011

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

Ответы [ 4 ]

8 голосов
/ 21 декабря 2011

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

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

5 голосов
/ 21 декабря 2011

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

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

Прочитайте инструкцию linux clock .

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

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

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

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

Имейте в виду, что на текущем (ноутбук, настольный компьютер, сервер) вышло из строя конвейеризовано суперскалярно процессоров со сложными процессорных кешей и TLB и предсказатели ветвления , время выполнения какого-то крошечного цикла или последовательности машинных инструкций не воспроизводится (количество наносекунд будет варьироваться от одного прогона к следующему).И ОС также добавляет случайность ( планирование , переключение контекста , прерывания , кэш страницы , копирование при записи , request-paging ...), поэтому нет смысла измерять выполнение какой-либо команды длительностью более одной миллисекунды - или, возможно, 100 мкс, если вам повезет - с точностью.Вы должны тестировать свою команду несколько раз.

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

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

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

2 голосов
/ 01 марта 2012

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

0 голосов
/ 21 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...