File size: 3,220 Bytes
311d153 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | // cpp_quant_engine/src/main_hft_demo.cpp
#include <iostream>
#include <chrono>
#include <thread>
#include "../include/binary_itch_parser.h"
#include "../include/spsc_ring_buffer.h"
struct QuantTick {
char ticker[8];
double price;
uint32_t shares;
uint64_t timestamp_ns;
};
int main() {
std::cout << "========================================================\n";
std::cout << "⚡ Quant.ai C++ Native HFT Binary Engine Benchmark Demo\n";
std::cout << "========================================================\n";
// Demo 1: Binary ITCH Struct Parsing Speed Benchmark
AddOrderMsg raw_msg;
raw_msg.message_type = 'A';
raw_msg.stock_locate = 1;
raw_msg.tracking_num = 101;
raw_msg.timestamp = 1693248000000000000ULL;
raw_msg.order_ref_num = 88992211ULL;
raw_msg.buy_sell_indicator = 'B';
raw_msg.shares = 500;
std::memcpy(raw_msg.stock, "TSLA ", 8);
raw_msg.price = 3455000; // $345.5000
const uint8_t* raw_buf = reinterpret_cast<const uint8_t*>(&raw_msg);
constexpr int ITERATIONS = 1000000; // 1,000,000 parses
auto start_time = std::chrono::high_resolution_clock::now();
AddOrderMsg parsed;
for (int i = 0; i < ITERATIONS; ++i) {
BinaryITCHParser::parseAddOrder(raw_buf, sizeof(AddOrderMsg), parsed);
}
auto end_time = std::chrono::high_resolution_clock::now();
double total_ms = std::chrono::duration<double, std::milli>(end_time - start_time).count();
double avg_ns = (total_ms * 1000000.0) / ITERATIONS;
std::cout << "[+] Binary ITCH Struct Parsing Speed Test:\n";
std::cout << " Iterations: " << ITERATIONS << " parses\n";
std::cout << " Total Time: " << total_ms << " ms\n";
std::cout << " Avg Latency per Parse: " << avg_ns << " nanoseconds (ns) -- Zero JSON Overhead!\n";
std::cout << " Decoded Ticker: [" << BinaryITCHParser::decodeTicker(parsed.stock) << "]\n";
std::cout << " Decoded Price: $" << BinaryITCHParser::decodePrice(parsed.price) << "\n\n";
// Demo 2: Lock-Free SPSC RingBuffer Transfer Throughput Benchmark
SPSCRingBuffer<QuantTick, 65536> ring_buffer;
QuantTick tick_sample;
std::memcpy(tick_sample.ticker, "NVDA ", 8);
tick_sample.price = 125.80;
tick_sample.shares = 200;
tick_sample.timestamp_ns = 1693248000100000000ULL;
start_time = std::chrono::high_resolution_clock::now();
int success_pushes = 0;
for (int i = 0; i < ITERATIONS; ++i) {
if (ring_buffer.push(tick_sample)) {
success_pushes++;
}
QuantTick popped;
ring_buffer.pop(popped);
}
end_time = std::chrono::high_resolution_clock::now();
total_ms = std::chrono::duration<double, std::milli>(end_time - start_time).count();
avg_ns = (total_ms * 1000000.0) / ITERATIONS;
std::cout << "[+] Lock-Free SPSC RingBuffer IPC Throughput Test:\n";
std::cout << " Pushes/Pops: " << success_pushes << " ops\n";
std::cout << " Total Time: " << total_ms << " ms\n";
std::cout << " Avg Latency per Lock-Free Push+Pop: " << avg_ns << " nanoseconds (ns)\n";
std::cout << "========================================================\n";
return 0;
}
|