피드로 돌아가기
How I Built an HFT Matching Engine (And All The Things I Got Wrong)
Dev.toDev.to
Backend

C++ 최적화를 통한 HFT 엔진 처리량 3배 및 p999 지연시간 13배 개선

How I Built an HFT Matching Engine (And All The Things I Got Wrong)

Saksham Arora2026년 4월 13일6advanced

Context

초기 설계에서 std::map과 std::deque를 활용한 범용 컨테이너 기반의 매칭 엔진 구조 채택. IEEE 754 부동 소수점 오차로 인한 매칭 오류와 힙 할당 및 포인터 추적으로 인한 Cache Miss 기반의 성능 병목 발생.

Technical Solution

  • IEEE 754 정밀도 문제를 해결하기 위한 가격 데이터의 Integer Ticks 변환 및 정수 비교 방식 도입
  • std::map의 O(log n) 탐색과 포인터 추적 비용 제거를 위한 Flat Array 기반의 O(1) 가격 레벨 접근 구조 설계
  • std::deque의 O(n) 취소 연산 병목 해결을 위해 Order 객체 내 prev/next 포인터를 포함한 Intrusive Doubly-Linked List 적용
  • match() 함수 내 std::vector 반환으로 인한 빈번한 힙 할당을 제거하기 위해 Callback Template 기반의 Zero-allocation 구조 구현
  • CPU Cache Locality 극대화를 위한 데이터 인접 배치 및 컴파일러 Inlining 유도 전략 적용

- 금융 데이터 처리 시 부동 소수점 대신 Integer-based Fixed-point 표현식 사용 검토 - 빈번한 삭제/취소가 발생하는 큐 구조에서 O(1) 성능 보장을 위한 Intrusive List 도입 고려 - 고성능 루프 내에서 컨테이너 반환 대신 Callback 함수를 통한 결과 처리로 Allocation 비용 제거 - 프로파일링 시 단순 TPS 외에 p99, p999 등 테일 레이턴시 지표를 통한 최악의 경우 분석

원문 읽기