NIC에서 패킷을 캡처하고 패킷 페이로드의 일부를 문자열로 저장하려고합니다.연도가 프로그래밍 방식으로 변경되었는지 확인하는 가장 효율적인 방법은 무엇입니까
저장해야하는 패킷의 일부는 SysLog로 알려진 로그 시간입니다. 각 패킷에는 다음과 같은 형식의 SysLog가 있습니다.
Nov 01 03 14:50:25 TCP...[other parts of packet Payload]
위에서 볼 수 있듯이 SysLog 패킷에는 연도 번호가 없습니다. 내 프로그램이 일 년 내내 실행되어야하므로 패킷 SysLog에 연도 번호를 추가하고 SysLog를 기원 시간으로 변환해야합니다. 내가 저장해야하는 최종 문자열은 다음과 같다 : 나는 EpochTime에 시스템 로그를 변환하는 다음 코드 평화를 사용
1478175389-TCP, ….
.
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);
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 pps이며 위의 코드는 currentYear()에서 매우 시간이 많이 걸립니다. 하나의 가능한 최적화는 currentYear() 메서드를 제거하고 연도 번호를 상수 값으로 저장하는 것입니다. 앞서 말했듯이 내 프로그램은 일 년 내내 운영되어야하며 2017 년이 다가오고 있음을 알고 있습니다. 우리는 2012 년 3 월 31 일 23:59:00에 바이너리를 바꿀 수 없으며 Year Number를 계산할 시간을 낭비하고 싶지 않습니다 !!
각 패킷에 대해 실행하지 않고 현재 연도 수를 계산하는보다 효율적인 방법이 필요합니다.
가능합니까? 나에 대한 당신의 제안은 무엇입니까?
정확히 무엇이 가장 많은 시간을 차지했는지 프로파일 링 했습니까? 문자열 변환이라면 아이디어가 있지만 시간이 많이 걸릴지 확실하지 않을 수 있습니다. 또한 모듈러스는 일반적으로 값 비싼 연산입니다. – Hayt
소스 타임 스탬프가 불완전한 경우이를 절대적으로 수행 할 수 없습니다. –
C++ (C와 C++이 다른 언어 임)를 사용하고 있기 때문에 C 태그를 제거했고'auto '와'chrono' 라이브러리를 사용하기 때문에 C++ 11 태그를 추가했습니다 – wasthishelpful