#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()
выполнение заняло бы больше пары сотен микросекунд, а не миллисекунд.)