
Pazarlama iddiaları değil, ölçülen sonuçlar. Tüm kıyaslamalar GCC 13.3, 100.000 yineleme, CPU sabitlenmiş Linux üzerinde çalışır.
Temel FIX işlemleri arasında birebir karşılaştırma.
| Metrik | QuickFIX | NexusFIX | İyileştirme |
|---|---|---|---|
| ExecutionReport Parse | 730 ns | 246 ns | 3,0 kat daha hızlı |
| NewOrderSingle Ayrıştırma | 661 ns | 229 ns | 2,9 kat daha hızlı |
| Alan Erişimi (4 alan) | 31 ns | 11 ns | 2.9x faster |
| Verim | 1,19 milyon msg/sn | 4,17 milyon mesaj/sn | 3,5 kat daha yüksek |
| P99 Gecikme | 784 ns | 258 ns | 3,0 kat daha düşük |
Dört birleştirme aşamasında 730ns'den 246ns'ye nasıl gittik.
Std::string kopyalarını orijinal arabellekte std::span<const char> görünümleriyle değiştirin. Bir std::span yığında 16 bayttır — yığın yok, kopya yok, yıkıcı yok.
std::map<int, std::string>'i önceden indekslenmiş bir diziyle değiştirin. Saha erişimi, FIX etiket numarasıyla indekslenen tek bir hareket talimatı haline gelir.
AVX2 vektörize SOH sınırlayıcı taraması, döngü başına 32 bayt işler. Bayt bayt taramadan ~13 kat daha hızlı.
consteval alan ofset tabloları ve 22 derleme zamanı arama tablosu, numaralandırma/tür dönüşümü için ~300 çalışma zamanı dalını ortadan kaldırır.
Sıcak yolda bir NewOrderSingle mesajını işlemek.
| İşlem | QuickFIX | NexusFIX |
|---|---|---|
| Yığın Tahsisi | ~12 (std::string, std::map düğümleri) | 0 |
| Alan Depolama | std::map<int, std::string> kopyalar | std::span görünümleri orijinal ara belleğe |
| Ayrıştırma Mantığı | Çalışma zamanı haritası ekleme | Derleme zamanı uzaklık tablosu |
| Bellek Ayak İzi | Dinamik, tahmin edilemez | Statik, önceden tahsis edilmiş PMR havuzu |
| Yıkıcı Ek Yükü | ~12 std::string yıkıcılar | 0 (sahip olunan bellek yok) |
3 kat performans sağlayan tasarım kararları.
| Teknik | QuickFIX | NexusFIX |
|---|---|---|
| Bellek | Mesaj başına yığın tahsisi | Sıfır kopya std::span görünümleri |
| Alan Arama | O(log n) std::map | O(1) doğrudan dizi indeksleme |
| Ayrıştırma | Bayt-bayt tarama | AVX2 SIMD vektörleştirilmiş |
| Alan Uzaklıkları | Çalışma zamanı hesaplama | derleme zamanını ayarlama |
| Enum Dönüşümü | Çalışma zamanı anahtarı (~300 dal) | 22 derleme zamanı arama tablosu |
| Hata İşleme | İstisnalar | std::beklenen (atma yok) |
11 endüstri lideri kütüphane incelendi. Ne öğrendik, ne inşa ettik, ne ölçtük.
| Kütüphane | Ne Öğrendik | Ne İnşa ettik | Sonuç |
|---|---|---|---|
| hffix | O(n) yineleyici araması, yoğun FIX paketleri için yetersizdir | consteval alan ofsetleri + O(1) doğrudan indeksleme | 14ns alan erişimi |
| Abseil | SIMD inceleme ve H2 parmak izleriyle İsviçre Tabloları | absl::oturum deposu içinflat_hash_map | %31 daha hızlı aramalar |
| Quill | Ertelenmiş biçimlendirmeyle kilitsiz SPSC kuyruğu | Günlük arka ucu olarak Quill | 8ns medyan günlük gecikmesi |
| NanoLog | 7ns günlük kaydı için ikili kodlama + arka plan iş parçacığı | Statik ikili serileştirmeyle Ertelenmişİşlemci<T> | %84 azalma (75→12ns) |
| liburing | DEFER_TASKRUN, çekirdek görevi uyandırmalarını ortadan kaldırır | io_uring + kayıtlı arabellekler + çoklu atış | %7-27 daha hızlı I/O |
| Otoyol | Talimat setleri arasında taşınabilir SIMD soyutlaması | FIX kalıpları için elle ayarlanmış içsel bilgiler | 13 kat verim |
| Seastar | Hiçbir şey paylaşma reaktörü yüksek eşzamanlı G/Ç | Çekirdek sabitleme + kilitsiz ardışık düzen | %8 P99 iyileştirme |
| Aptallık | Gelişmiş bellek koruması ve kilitsiz temel öğeler | Yerel SPSC kuyruğu + bit maskeleme doğrulama | Sıfır bağımlılık |
| Rigtorp | Önbellek hattı dolgusu yanlış paylaşımı ortadan kaldırır | Aynı tekniklerle yerel SPSCQueue | 88M işlem/sn, 11ns |
| xsimd | Matematik işlemleri için genel SIMD sarmalayıcıları | SOH taraması için doğrudan Intel özellikleri | 2 kat daha hızlı sarmalayıcılar |
| Boost.PMR | Monotonik tampon, mesaj başına arena tahsisine olanak tanır | std::pmr::monotonic_buffer_resource | Sıfır yığın tahsisi |
Karşılaştırmaları kendiniz oluşturup çalıştırmanız için üç komut.
git clone https://github.com/StratCraft/NexusFIX.git
cd NexusFIX
./start.sh build