StratCraft

성능 벤치마크

마케팅 주장이 아닌 실측 결과. 모든 벤치마크는 Linux, GCC 13.3, 100,000회 반복, CPU 고정 환경에서 실행.

NexusFIX vs QuickFIX

핵심 FIX 작업별 정면 비교.

지표QuickFIXNexusFIX개선율
ExecutionReport 파싱730 ns246 ns3.0배 빠름
NewOrderSingle 파싱661 ns229 ns2.9배 빠름
필드 접근 (4개 필드)31 ns11 ns2.9배 빠름
처리량119만 msg/초417만 msg/초3.5배 높음
P99 지연784 ns258 ns3.0배 낮음

최적화 여정

730ns에서 246ns까지, 4단계 복합 최적화.

1단계: 제로 카피 파싱730ns → 520ns

std::string 복사를 원본 버퍼의 std::span<const char> 뷰로 대체. std::span은 스택에서 16바이트 — 힙 없음, 복사 없음, 소멸자 없음.

2단계: O(1) 필드 조회520ns → 380ns

std::map<int, std::string>을 사전 인덱싱된 배열로 대체. 필드 접근이 FIX 태그 번호로 인덱싱된 단일 mov 명령어가 됩니다.

3단계: SIMD 구분자 스캔380ns → 290ns

AVX2 벡터화 SOH 구분자 스캔으로 사이클당 32바이트 처리. 바이트 단위 스캔 대비 약 13배 빠름.

4단계: 컴파일 타임 오프셋290ns → 246ns

consteval 필드 오프셋 테이블과 22개 컴파일 타임 조회 테이블로 enum/타입 변환의 런타임 분기 약 300개 제거.

제로 할당 증명

핫 패스에서 NewOrderSingle 메시지 처리.

작업QuickFIXNexusFIX
힙 할당약 12회 (std::string, std::map 노드)0
필드 저장std::map<int, std::string> 복사원본 버퍼의 std::span 뷰
파싱 로직런타임 맵 삽입컴파일 타임 오프셋 테이블
메모리 풋프린트동적, 예측 불가정적, 사전 할당 PMR 풀
소멸자 오버헤드std::string 소멸자 약 12회0 (소유 메모리 없음)

기법 비교

3배 성능을 복합적으로 달성하는 설계 결정.

기법QuickFIXNexusFIX
메모리메시지당 힙 할당제로 카피 std::span 뷰
필드 조회O(log n) std::mapO(1) 직접 배열 인덱싱
파싱바이트 단위 스캔AVX2 SIMD 벡터화
필드 오프셋런타임 계산consteval 컴파일 타임
Enum 변환런타임 switch (~300개 분기)22개 컴파일 타임 조회 테이블
오류 처리예외std::expected (throw 없음)

아키텍처 영향

11개 업계 선도 라이브러리 분석. 배운 것, 구축한 것, 측정한 것.

라이브러리배운 것구축한 것결과
hffixO(n) 이터레이터 조회는 밀집 FIX 패킷에 비효율적consteval 필드 오프셋 + O(1) 직접 인덱싱14ns 필드 접근
AbseilSIMD 프로빙과 H2 핑거프린트를 사용한 Swiss Tables세션 저장소에 absl::flat_hash_map 사용31% 빠른 조회
Quill지연 포매팅을 사용한 락프리 SPSC 큐로깅 백엔드로 Quill 사용8ns 중간값 로그 지연
NanoLog7ns 로깅을 위한 바이너리 인코딩 + 백그라운드 스레드정적 바이너리 직렬화를 사용한 DeferredProcessor<T>84% 감소 (75→12ns)
liburingDEFER_TASKRUN이 커널 태스크 웨이크업 제거io_uring + 등록 버퍼 + multishot7-27% 빠른 I/O
Highway명령어 집합 전반의 이식 가능한 SIMD 추상화FIX 패턴을 위한 수동 튜닝 인트린직 유지13배 처리량
Seastar고동시성 I/O를 위한 공유 없는 리액터코어 고정 + 락프리 파이프라이닝8% P99 개선
Folly고급 메모리 펜싱과 락프리 프리미티브네이티브 SPSC 큐 + 비트 마스킹 검증제로 의존성
Rigtorp캐시 라인 패딩으로 거짓 공유 제거동일 기법을 사용한 네이티브 SPSCQueue8,800만 ops/초, 11ns
xsimd수학 연산을 위한 일반 SIMD 래퍼SOH 스캔을 위한 직접 Intel 인트린직래퍼 대비 2배 빠름
Boost.PMR단조 버퍼로 메시지당 아레나 할당 가능std::pmr::monotonic_buffer_resource힙 할당 제로

NexusFIX를 직접 사용해 보세요

세 가지 명령으로 직접 빌드하고 벤치마크를 실행하세요.

git clone https://github.com/StratCraft/NexusFIX.git\ncd NexusFIX\n./start.sh build