
마케팅 주장이 아닌 실측 결과. 모든 벤치마크는 Linux, GCC 13.3, 100,000회 반복, CPU 고정 환경에서 실행.
핵심 FIX 작업별 정면 비교.
| 지표 | QuickFIX | NexusFIX | 개선율 |
|---|---|---|---|
| ExecutionReport 파싱 | 730 ns | 246 ns | 3.0배 빠름 |
| NewOrderSingle 파싱 | 661 ns | 229 ns | 2.9배 빠름 |
| 필드 접근 (4개 필드) | 31 ns | 11 ns | 2.9배 빠름 |
| 처리량 | 119만 msg/초 | 417만 msg/초 | 3.5배 높음 |
| P99 지연 | 784 ns | 258 ns | 3.0배 낮음 |
730ns에서 246ns까지, 4단계 복합 최적화.
std::string 복사를 원본 버퍼의 std::span<const char> 뷰로 대체. std::span은 스택에서 16바이트 — 힙 없음, 복사 없음, 소멸자 없음.
std::map<int, std::string>을 사전 인덱싱된 배열로 대체. 필드 접근이 FIX 태그 번호로 인덱싱된 단일 mov 명령어가 됩니다.
AVX2 벡터화 SOH 구분자 스캔으로 사이클당 32바이트 처리. 바이트 단위 스캔 대비 약 13배 빠름.
consteval 필드 오프셋 테이블과 22개 컴파일 타임 조회 테이블로 enum/타입 변환의 런타임 분기 약 300개 제거.
핫 패스에서 NewOrderSingle 메시지 처리.
| 작업 | QuickFIX | NexusFIX |
|---|---|---|
| 힙 할당 | 약 12회 (std::string, std::map 노드) | 0 |
| 필드 저장 | std::map<int, std::string> 복사 | 원본 버퍼의 std::span 뷰 |
| 파싱 로직 | 런타임 맵 삽입 | 컴파일 타임 오프셋 테이블 |
| 메모리 풋프린트 | 동적, 예측 불가 | 정적, 사전 할당 PMR 풀 |
| 소멸자 오버헤드 | std::string 소멸자 약 12회 | 0 (소유 메모리 없음) |
3배 성능을 복합적으로 달성하는 설계 결정.
| 기법 | QuickFIX | NexusFIX |
|---|---|---|
| 메모리 | 메시지당 힙 할당 | 제로 카피 std::span 뷰 |
| 필드 조회 | O(log n) std::map | O(1) 직접 배열 인덱싱 |
| 파싱 | 바이트 단위 스캔 | AVX2 SIMD 벡터화 |
| 필드 오프셋 | 런타임 계산 | consteval 컴파일 타임 |
| Enum 변환 | 런타임 switch (~300개 분기) | 22개 컴파일 타임 조회 테이블 |
| 오류 처리 | 예외 | std::expected (throw 없음) |
11개 업계 선도 라이브러리 분석. 배운 것, 구축한 것, 측정한 것.
| 라이브러리 | 배운 것 | 구축한 것 | 결과 |
|---|---|---|---|
| hffix | O(n) 이터레이터 조회는 밀집 FIX 패킷에 비효율적 | consteval 필드 오프셋 + O(1) 직접 인덱싱 | 14ns 필드 접근 |
| Abseil | SIMD 프로빙과 H2 핑거프린트를 사용한 Swiss Tables | 세션 저장소에 absl::flat_hash_map 사용 | 31% 빠른 조회 |
| Quill | 지연 포매팅을 사용한 락프리 SPSC 큐 | 로깅 백엔드로 Quill 사용 | 8ns 중간값 로그 지연 |
| NanoLog | 7ns 로깅을 위한 바이너리 인코딩 + 백그라운드 스레드 | 정적 바이너리 직렬화를 사용한 DeferredProcessor<T> | 84% 감소 (75→12ns) |
| liburing | DEFER_TASKRUN이 커널 태스크 웨이크업 제거 | io_uring + 등록 버퍼 + multishot | 7-27% 빠른 I/O |
| Highway | 명령어 집합 전반의 이식 가능한 SIMD 추상화 | FIX 패턴을 위한 수동 튜닝 인트린직 유지 | 13배 처리량 |
| Seastar | 고동시성 I/O를 위한 공유 없는 리액터 | 코어 고정 + 락프리 파이프라이닝 | 8% P99 개선 |
| Folly | 고급 메모리 펜싱과 락프리 프리미티브 | 네이티브 SPSC 큐 + 비트 마스킹 검증 | 제로 의존성 |
| Rigtorp | 캐시 라인 패딩으로 거짓 공유 제거 | 동일 기법을 사용한 네이티브 SPSCQueue | 8,800만 ops/초, 11ns |
| xsimd | 수학 연산을 위한 일반 SIMD 래퍼 | SOH 스캔을 위한 직접 Intel 인트린직 | 래퍼 대비 2배 빠름 |
| Boost.PMR | 단조 버퍼로 메시지당 아레나 할당 가능 | std::pmr::monotonic_buffer_resource | 힙 할당 제로 |
세 가지 명령으로 직접 빌드하고 벤치마크를 실행하세요.
git clone https://github.com/StratCraft/NexusFIX.git\ncd NexusFIX\n./start.sh build