Я знаю, что у этого вопроса слишком много переменных, чтобы иметь один ответ, но был бы признателен за вашу помощь в понимании вариантов.
Мое приложение должно получать очень большое количество событий из сети и должно "штамповать" каждое сообщение с временем прибытия, по крайней мере, с разрешением в миллисекундах, чтобы впоследствии выполнить ряд вычислений на основе этих временных меток.
Мой прошлый опыт говорит мне, что получение часового времени с высокой скоростью является убийцей производительности, поскольку они переходят на вызовы системы/ядра. Существуют ли "менее худшие варианты" в среде Unix в C++?
В качестве отправной точки я использую сейчас "boost :: posix_time :: microsec_clock :: local_time()"
который идет на разрешение микросекунды (что мне не нужно), и это дает мне абсолютное время (где в принципе я был бы в порядке с относительным смещением к любой эпохе).
Каковы мои лучшие альтернативы?
Я не могу сказать, что быстрее, но подумали ли вы о том, какое время вам нужно?
clock(3)
: тики CPU... полезны для тестирования производительности, но не для синхронизации сетевых вызовов или временных меток.clock_gettime(3)
CLOCK_MONOTONIC
: Непрерывное время... полезно для таймирования сетевых вызовов.gettimeofday(2)
: Настенное время... полезно для временных меток и, возможно, для тестирования производительности.Убедитесь, что любой метод времени, который вы выбираете, соответствует вашим потребностям.
Ниже вы получаете отметки времени в микросекундах (которые, как вы говорите, слишком много для вас). легко настроить деление/умножение, чтобы получить микросекунды:
const uint32_t getTime()
{
struct timeval tv;
struct timezone tz;
struct tm *tm;
gettimeofday(&tv, &tz);
tm = localtime(&tv.tv_sec);
return (tm->tm_hour * 3600000000/*3600 * 1000 * 1000*/) +
(tm->tm_min * 60000000/*60 * 1000 * 1000*/) +
(tm->tm_sec * 1000000/*1000 * 1000*/) +
(tv.tv_usec);
}
time(NULL)
?