Я пытаюсь захватить пакеты из NIC и сохранить часть полезной нагрузки пакета в виде строки.Какой самый эффективный способ программно проверить, изменился ли год?
На части пакета, который должен быть сохранен, является его время журнала, известное как SysLog. Каждый пакетов имеет SysLog в следующем формате:
Nov 01 03 14:50:25 TCP...[other parts of packet Payload]
Как можно видеть, пакет SysLog не имеет год номер. Моя программа должна работать круглый год, поэтому мне нужно добавить Year Number в пакет SysLog и преобразовать SysLog в эпоху. Заключительная строка, которую я должен хранить, как это:
1478175389-TCP, ….
Я использую следующий мир кода для преобразования Syslog в EpochTime.
tm* tm_date = new tm();
Std ::string time = Current_Year;
time += " ";
time += packet.substr(0,18);
strptime(time.c_str(), "%Y %b %d %T", tm_date);
EpochTime = timegm(tm_date);
The CURRENTYEAR Метод:
std::string currentYear() {
std::stringstream now;
auto tp = std::chrono::system_clock::now();
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch());
size_t modulo = ms.count() % 1000;
time_t seconds = std::chrono::duration_cast<std::chrono::seconds>(ms).count();
#if HAS_STD_PUT_TIME
#else
char buffer[25]; // holds "2013-12-01 21:31:42"
if (strftime(buffer, 25, "%Y", localtime(&seconds))) {
now << buffer;
}
#endif // HAS_STD_PUT_TIME
return now.str();
}
Приведенные выше операции, что я должен сделать для каждого пакета. Скорость передачи пакетов составляет 100000-1000000 п.п., и вышеуказанный мир кода очень трудоемкий на текущий год(). Одна из возможных оптимизаций - удалить метод currentYear() и сохранить число Year в качестве постоянного значения. Как было сказано ранее, моя программа должна запускаться круглый год, и, как вы знаете, 2017 год идет. Мы не можем изменить наш бинарный файл 31/12/2016 23:59:00, а также не хотим тратить время на вычисление номера года!
Мне нужен более эффективный способ расчета номера текущего года без его запуска для каждого пакета.
Возможно ли это? Каково ваше предложение для меня?
Вы профилировали то, что именно занимает больше всего времени? Если это преобразование строк, у меня может возникнуть идея, но не уверен, что требуется много времени. Кроме того, по модулю это дорогостоящая операция. – Hayt
Вы не можете сделать это безошибочно, если исходные временные метки являются неполными. –
Я удалил тэг C с тех пор, как вы используете C++ (C и C++ - разные языки), и добавил тег C++ 11, так как вы используете ключевое слово 'auto' и' chrono' library – wasthishelpful