Files
qmt_bridge/reference/xtquant_big_convert/bench_zmq_spike.py
T

52 lines
1.6 KiB
Python

# coding: utf-8
"""Measure ZMQ GIL-spike rate at different request rates.
Sends N get_full_tick requests at a fixed interval, records per-call
latency, reports how many exceed thresholds (50/200/500/1000ms).
"""
import sys
import time
sys.path.insert(0, r"D:\gjzqqmt\xtquant_big_convert\src")
sys.path.insert(0, r"D:\国金证券QMT交易端_lemo\python")
import bigqmt_signal_trader.xtquant_compat as compat
compat.configure()
client = compat.get_default_client()
print("account:", client.account_id, "| transport:", client.transport_name)
print("=" * 60)
N = 40
INTERVAL_MS = 50 # 请求间隔 50ms = 20 QPS
latencies = []
for i in range(N):
t0 = time.time()
try:
client.call("get_full_tick", {"codes": ["000001.SZ"]})
ms = (time.time() - t0) * 1000
latencies.append(ms)
except Exception as e:
ms = (time.time() - t0) * 1000
latencies.append(ms)
print(" [%2d] FAIL %.0fms %s" % (i, ms, str(e)[:40]))
# 控制频率
elapsed = (time.time() - t0)
sleep = max(0, INTERVAL_MS / 1000.0 - elapsed)
if sleep > 0:
time.sleep(sleep)
latencies.sort()
n = len(latencies)
print("\n=== %d requests @ %dms interval (%.0f QPS) ===" % (n, INTERVAL_MS, 1000.0/INTERVAL_MS))
print("min=%.1f p50=%.1f p90=%.1f p99=%.1f max=%.1f" % (
latencies[0], latencies[n//2], latencies[int(n*0.9)], latencies[int(n*0.99)], latencies[-1]))
# 尖峰分布
thresholds = [10, 50, 100, 200, 500, 1000]
print("\n=== 延迟分布 ===")
for t in thresholds:
cnt = sum(1 for l in latencies if l > t)
print(" >%5dms : %2d / %d (%.0f%%)" % (t, cnt, n, 100.0*cnt/n))