Какой самый эффективный способ получить время в * nix в C ++ / boost?

0

Я знаю, что у этого вопроса слишком много переменных, чтобы иметь один ответ, но был бы признателен за вашу помощь в понимании вариантов.

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

Мой прошлый опыт говорит мне, что получение часового времени с высокой скоростью является убийцей производительности, поскольку они переходят на вызовы системы/ядра. Существуют ли "менее худшие варианты" в среде Unix в C++?

В качестве отправной точки я использую сейчас "boost :: posix_time :: microsec_clock :: local_time()"

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

Каковы мои лучшие альтернативы?

  • 1
    Есть проблемы со time(NULL) ?
  • 0
    У вас есть примеры кода / меры под рукой, чтобы улучшить ваши предположения?
Показать ещё 2 комментария
Теги:
boost

2 ответа

2

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

  • clock(3): тики CPU... полезны для тестирования производительности, но не для синхронизации сетевых вызовов или временных меток.
  • clock_gettime(3) CLOCK_MONOTONIC: Непрерывное время... полезно для таймирования сетевых вызовов.
  • gettimeofday(2): Настенное время... полезно для временных меток и, возможно, для тестирования производительности.

Убедитесь, что любой метод времени, который вы выбираете, соответствует вашим потребностям.

0

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

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);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню