Более точный эквивалент команды "time" в Linux относительно системного и пользовательского времени? - PullRequest
4 голосов
/ 21 ноября 2010

Я нахожусь в следующей ситуации:

Я хочу определить системное и пользовательское время маленьких фрагментов кода (PHP- и C ++).Очевидно, что я мог бы использовать двоичный файл «time» в Linux, но, учитывая тот факт, что эти фрагменты работают так быстро, нормального (или даже многословного) вывода «time» не будет достаточно для моей цели.Точность «времени» уходит в миллисекунды, а мне нужны микросекунды.Или даже лучше: наносекунды.

Может кто-нибудь указать мне на программное обеспечение, которое может сделать это для меня?Я нашел материал для настенного времени, но меня интересует именно системное и пользовательское время.

Заранее спасибо!

Кстати: я использую Ubuntu 10.10 64-bit

Ответы [ 3 ]

3 голосов
/ 21 ноября 2010

Не существует метода, который бы дал вам какой-либо эквивалент sys или пользовательского времени, как сообщается командой time, которая будет более точной.Большая часть очевидной точности команды time является ложной точностью в том виде, в каком она есть.

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

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

Это очень похоже на то, почему time дает вам точность, которая предположительно в микросекундах, но на самом делезначительно менее точный.В любой данной системе в любой момент времени происходит много всего, и все это вносит ошибку в вычисления.Прерывания от сетевого ввода-вывода или дискового ввода-вывода, прерывания таймера для запуска планировщика, что другие процессы делают с кэшем ЦП L1 или L2.Все это складывается.

Использование что-то вроде valgrind, которое запускает вашу программу на имитируемом процессоре, может дать вам числа, которые, по-видимому, точно соответствуют количеству циклов процессора.Но эта точность не то, что вы будете испытывать в реальном мире.Лучше использовать технику, которую я первоначально описал, и просто принять, что эти моменты могут быть нечеткими.

0 голосов
/ 21 ноября 2010

clock_gettime() даст вам наносекундное разрешение.

0 голосов
/ 21 ноября 2010

gettimeofday() даст вам микросекундное разрешение.

...