Точные временные метки с использованием gettimeofday и localtime

#c #c #timing #localtime #gettimeofday

#c #c #синхронизация #localtime #gettimeofday

Вопрос:

Я пытаюсь отслеживать системное время, прошедшее через несколько приложений и путей передачи данных, с помощью gettimeoday и localtime. В этом примере я хочу получить системное время (точность в микросекундах) непосредственно перед запуском моего кода. В настоящее время я делаю это следующим образом:

 #include <stdio.h>
#include <sys/time.h>

struct timeval tv;
struct timezone tz;
struct tm *tm;

**code I don't care about**

gettimeofday(amp;tv, NULL);
tm=localtime(amp;tv.tv_sec);

**code to watch**    

printf(" %d:d:d %ld n", tm->tm_hour, tm->tm_min,
            tm->tm_sec, tv.tv_usec);
  

Насколько я понимаю, вызов localtime определенно сопряжен с небольшими накладными расходами и может снизить точность. Возможно, я совершенно не прав в этом, но должен ли я ждать вызова localtime до завершения моего кода для просмотра? Я предполагаю, что localtime просто выполняет полузатратное преобразование результатов gettimeofday, и поэтому его следует поместить прямо перед инструкцией printf.

Комментарии:

1. Вам localtime() вообще не нужно вызывать; gettimeofday() достаточно отслеживать прошедшее время.

2. Вместо того, чтобы определять длину определенного фрагмента кода, я хочу точно определить системное время с точностью до микросекунд. Должен ли я по-прежнему нуждаться только в gettimeofday()?

3. Да, я вообще не вижу, что добавляет вызов localtime() .

Ответ №1:

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

Комментарии:

1. Существует разница между точностью и разрешением; gettimeofday() имеет разрешение в микросекунды, но для выполнения потребуется много миллисекунд, как вы заявили.

2. Возможно, мне следовало использовать слово «детализация». Существует разница между разрешением системных часов и потенциальным разрешением представления. Под разрешением я имел в виду разрешение системных часов, которое (согласно Posix) не определено. (И я был бы удивлен, если gettimeofday() выполнение заняло бы больше пары сотен микросекунд, а не миллисекунд.)