1. 性能基准测试概述

大家好,我是老张。在量化交易系统这个圈子里摸爬滚打了十几年,今天咱们来聊聊一个绕不开的话题——性能基准测试。

说白了,基准测试就是给系统「称体重、量身高」。你想想看,没有测量就没有改进。我见过太多团队,上来就写代码、上策略,结果上线第一天就被行情数据冲垮了。嗯,这其实是可以避免的。

什么是性能基准测试

基准测试,英文叫 Benchmarking。它是一套标准化的测量方法。目的是评估系统在特定负载下的表现。

我个人习惯把它分成三类:

  • 微基准测试:测单个函数或模块。比如一个订单簿更新要多少纳秒。
  • 集成基准测试:测完整链路。从行情接入到策略计算再到订单发出。
  • 压力基准测试:测极限情况。比如同时涌入 10 万笔订单会怎样。

我在项目中遇到过最典型的例子:某团队说他们的系统延迟只有 5 微秒。结果一测,发现那是空载数据。加上真实行情后,直接飙到 50 微秒。这就是没做基准测试的后果。

核心要点:基准测试不是一次性的。它应该嵌入到你的 CI/CD 流程中。每次代码变更,都要跑一遍。

为什么量化交易系统需要基准测试

这个问题其实很直接。量化交易拼的是什么?速度、精度、稳定性。

我给你们列几个场景:

  1. 策略回测:你的回测引擎到底准不准?延迟模型对不对?
  2. 实盘交易:从行情到下单,整个链路能不能跑在 1 毫秒以内?
  3. 系统扩容:加了一台服务器,性能真的线性提升了吗?
  4. 技术选型:Kafka 和 RabbitMQ 哪个更适合你的场景?

我曾经帮一家私募做性能诊断。他们的策略在回测时年化收益 30%,实盘却只有 5%。为什么?因为回测时假设延迟为 0,实盘却有 2 毫秒的抖动。这就是基准测试缺失的代价。

避坑指南:我曾经见过有人用 System.currentTimeMillis() 来测延迟。这是大忌!Java 里应该用 System.nanoTime(),C++ 里用 std::chrono::high_resolution_clock。毫秒级的精度在量化交易里根本不够用。

基准测试的核心指标

量化交易系统的性能,主要看三个指标:延迟、吞吐量、抖动。我习惯叫它们「铁三角」。

指标 英文 定义 量化交易中的意义
延迟 Latency 从请求发出到收到响应的时间 决定你能不能抢到订单
吞吐量 Throughput 单位时间内处理的请求数 决定你能同时跑多少策略
抖动 Jitter 延迟的波动程度 决定你的策略是否稳定

延迟

延迟是量化交易里最敏感的指标。你想想看,在纳秒级竞争的市场里,1 微秒的差距可能就是盈利和亏损的分界线。

我建议关注这几个分位值:

  • P50:中位数延迟。代表典型表现。
  • P99:99% 的请求都在这个延迟以内。代表尾部表现。
  • P99.9:千分之一的最差情况。这个值往往被忽略,但它最致命。

为什么?因为 P99.9 的延迟抖动,可能让你的止损单晚到了 10 毫秒。这 10 毫秒,行情可能已经跳了 5 个 tick。

个人经验:我习惯用 HDR Histogram 来记录延迟数据。它比平均值靠谱多了。平均值会掩盖很多问题。比如 99% 的请求都是 1 微秒,但 1% 的请求是 100 微秒,平均值才 2 微秒。这能说明问题吗?不能。

吞吐量

吞吐量决定了你的系统能承载多大的业务量。比如你的行情网关每秒能处理多少笔 tick 数据。

这里有个常见的误区:很多人以为吞吐量越高越好。其实不是。吞吐量和延迟是 trade-off。你把吞吐量推到极限,延迟就会飙升。

我一般会这样做:

  1. 先确定业务要求的最大延迟(比如 1 毫秒)
  2. 然后在这个约束下,测出最大吞吐量
  3. 最后留 30% 的余量

举个例子:

// 伪代码:吞吐量测试
int maxLatencyUs = 1000;  // 目标延迟上限 1 毫秒
int currentThroughput = 0;
while (true) {
    sendRequests(++currentThroughput);
    long latency = measureLatency();
    if (latency > maxLatencyUs) {
        break;  // 找到瓶颈了
    }
}
System.out.println("最大吞吐量: " + currentThroughput + " req/s");

抖动

抖动,说白了就是延迟的「脾气」。有的系统平时很乖,延迟稳定在 10 微秒。但每隔几分钟就抽风一次,跳到 100 微秒。这种系统最可怕。

我遇到过最夸张的一次:某系统的 P50 延迟只有 5 微秒,但 P99.9 延迟达到了 500 微秒。原因是 JVM 的 GC 停顿。后来我们换用了低延迟 GC 算法,才把抖动压下来。

衡量抖动,我推荐两个指标:

  • 标准差:反映整体波动情况
  • 最大-最小差值:反映极端情况

但说实话,这两个指标都不够直观。我更喜欢看延迟分布图。一眼就能看出有没有「长尾」。

记住:在量化交易里,不是快就好,而是稳才好。一个稳定在 20 微秒的系统,比一个平均 10 微秒但偶尔跳到 100 微秒的系统更可靠。

知识体系总览

下面这张图,是我对性能基准测试核心逻辑的总结。你可以把它当作本章的思维导图。

性能基准测试 延迟 吞吐量 抖动 P50 / P99 / P99.9 HDR Histogram 延迟约束下的极限 留 30% 余量 标准差 / 最大差值 延迟分布图 核心原则:不是快就好,而是稳才好 延迟 + 吞吐量 + 抖动 = 铁三角

这张图把本章的核心内容串起来了。你可以看到,三个指标是相互关联的。你不能只盯着一个看。

好了,关于性能基准测试的概述就聊到这里。记住,没有测量就没有改进。下一章咱们会深入聊具体的测试方法和工具。到时候我会分享一些实战中的踩坑经验。


专注资料整理