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

1 day ago 4

여러 주요 날짜/시간 라이브러리는 시/분/초를 구할 때 앞선 계산 결과를 차례로 기다리는 구조를 사용하며, 계산 순서만 바꿔도 이 대기 시간을 크게 줄일 수 있음 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사이클로 가...

Read Entire Article