타임스탬프를 시·분·초로 변환하는 더 빠른 방법

4 weeks ago 20

날짜를 분리한 뒤 남은 하루 내 초 단위 값 [0..86399] 은 계산 순서만 바꿔도 시·분·초 변환의 긴 의존성 체인을 줄일 수 있음 V1은 전체 분과 시간을 독립적으로 구한 뒤 초와 분을 병렬로 계산해, 복잡한 비트 기법 없이 근사 지연시간을 기존 16사이클에서 8사이클로 줄임 V2는 고정소수점 곱셈의 상·하위 비트로 약 6사이클에 도달하고, V3는 60진법 계산을 64진법 나머지 연산으로 바꿔 일부 대상에서 5사이클까지 단축함 실제 성능은 CPU·컴파일러와 지연시간·처리량 중 무엇을 우선하는지에 따라 달라지며, 밀리초 변환과 SIMD에도 별도의 최적화가 필요함 가독성을 원하면 V1, 높은 처리량과 짧은 지연시간을 함께 원하면 V2, 더 짧은 지연시간을 원하면 V3를 검토하되, 입력 범위와 윤초 처리 조건을 확인하고 대상 환경에서 벤치마크해야 함 기존 계산의 병목: 긴 의존성 체인 대상은 타임스탬프에서 날짜를 이미 분리한 뒤 남은 하루 내 초 단위 값 [0..86399] 이며, 날짜 계산은 범위 밖임 전통적 방식 1은 hour = time / 3600, rem = time % 3600, minute = rem / 60, second = rem % 60 순서로 계산함 Linux 커널, glibc, Go 표준 라이브러리, CPython datetime, OpenJDK java.time이 사용함 곱셈·시프트로 풀어낸 기계어 수준에서는 초가 분에, 분이 나머지에, 나머지가 시간에 의존해 계산을 겹치기 어려움 여러 타임스탬프를 반복 처리하면 슈퍼스칼라 CPU가 서로 다른 입력의 연산을 겹칠 수 있어 처리량은 비교적 양호할 수 있음 전통적 방식 2는 hour = time / 3600, minute = (time / 60) % 60, second = time % 60으로 각 요소를 구함 V8, Boost, musl이 사용하며, 요소마다 별도 함수를 두는 API 구조 때문에 선택하기도 함 의존성 체인이 짧아져 지연시간은 개선되지만, 실제 계산 수가 8개에서 10개로 늘어 처리량은 비슷하거나 나빠짐 사이클 비교는 정수 곱셈 3사이클, 나머지 연산 1사이클을 가정한 근사 모델임 이 모델에서 전통적 방식 1은 16사이클, 방식 2는 12사이클이며, 실제 벤치마크 관측과 강한 상관관계를 보임 범위 제한 고정소수점과 Neri의 접근 고정소수점 곱셈·시프트로 나눗셈을 직접 대체하면 일부 프로세서에서 더 빨라짐 / 60은 (u64)...

Read Entire Article