Adam DePrince 在木刻风格的软件工作室里,身边是穿着裤子的丝羽乌骨鸡

C++ / Python / 性能工程

Adam DePrince.

我在真正重要的地方让软件变快。

我的工作横跨运行时、数据库、存储、网络、算法和硬件。我分析完整系统, 把合适的工作移入原生代码,并且公开足够的测量上下文,让结果可以被复现。

这些项目包括 Django 的 C++ 移植、紧凑数据服务器、SIMD 库、非主流 CPU 架构、 低延迟传输,以及一套完整的电子交易参考系统。

最新项目 / cppdjango

Django 6.0.7。
移植到 C++。

cppdjango 保留熟悉的 Django API 和普通的 import django 接口, 同时把经过测量的 PostgreSQL ORM 终端路径移入原生代码。

在由点查询、有序 IN 查询和点更新组成的平衡测试中,框架侧 ORM 工作的 CPU 性能提高 436%, CPU 消耗减少 81.4%。数据库本身没有变快,项目也不声称每一个 Django API 都获得了同样的加速。

一个完整应用

电子交易参考系统

交易是这套性能工程的一个重要应用,但不是整个作品集。开源参考系统把因果式历史重放、 原生行情摄取、流式分析、低延迟扇出、目标仓位路由、券商执行和操作员控制连接成一套完整系统。

它使用 Massive 和 Alpaca,面向研究与日内策略,并不自称交易所托管的高频交易平台。 专页同时说明完整架构和它下面更快的基础机器。

查看完整交易系统栈

工作跨越多个层次

覆盖整台机器的性能工程

真正有效的优化往往不在最初看起来缓慢的函数里。我沿着成本穿过语言边界、 分配器、内存、操作系统、网络和硬件,直到找到真正拥有它的层。

01

应用运行时

保留有价值的 API,把经过测量的热路径移出解释器和框架机械工作。

02

数据结构

针对真实工作负载选择紧凑布局、分配行为、缓存流量、NUMA 布置和算法。

03

存储层次

让 RAM 保存延迟敏感的头部,SSD 保存温数据,磁盘提供容量,而不是假装每个字节都同样紧急。

04

传输

共享内存、RDMA、libfabric/EFA、XLIO、内核旁路,以及在普通 TCP 足够时使用普通 TCP。

05

SIMD 与处理器架构

面向 x86、Arm、LoongArch、RISC-V 和其他常被主流忽视的机器实现向量内核与运行时分派。

06

测量

CPU 核算、延迟分布、尾延迟分析、受控基准,以及让别人可以检查结论的原始资料。

部分开源项目

围绕可测量瓶颈构建的系统

这些项目并不属于同一个行业。每个项目都从 CPU、内存、存储或延迟中的具体成本出发, 并把证据作为软件的一部分。

数据结构与传输

Goblin Core

问题 Redis 兼容操作和进程间消息在每次请求中都要承担内存布局、解析和传输成本。

工作 紧凑 C++23 数据结构;RESP 与 SBE 可运行在共享内存环、单边 RDMA、libfabric/EFA、XLIO、Unix 套接字和 TCP 上。

测量 在 Threadripper PRO 5995WX 的相邻绑定核心上,通过 SBE 共享内存环完成一次紧凑 HSET 或 ZADD 请求/响应约需 220 ns。

意义 它既是一台有用的服务器,也是研究内存流量、协议开销和网络路径的实验室。

大对象存储

Goblin Store

问题 网络还未接近大对象尾部时,就把每个字节留在 RAM 中,会浪费昂贵内存。

工作 Memcached 兼容服务器把对象头部保存在锁定内存中,再从 SSD 或 HDD 异步流式读取后续字节。

证据 公开比较包含 Memcached 和 extstore,并给出工作负载、延迟、内存和存储成本上下文。

SIMD 序列算法

stride-align

问题 比对和距离算法拥有昂贵内循环,而且不同 CPU 的指令集差异巨大。

工作 面向 C++ 与 Python 的 Smith-Waterman、Needleman-Wunsch、编辑距离、语音编码和时间序列距离。

证据 基准公开后端、评分、位宽、工作负载和 CPU 上下文,而不是给出一个万能加速比。

流式分析

RTTA

问题 增量指标和在线模型不应在每个事件到来时重建数组或支付 dataframe 开销。

工作 319 种公开因果算法,共用一致的 C++23 与 Python 流式 API。

测量 每次公开运行覆盖 247 种算法;三个逐 CPU 中位数的平均值为:纯状态推进 57.7 ns,返回 Python 结果 77.4 ns。

LoongArch 优化

DragonArray

问题 当上游软件停留在通用代码或较窄向量扩展时,有用的硬件也会表现缓慢。

工作 可安装的 LoongArch 软件包、NumPy LASX、SIMD 超越函数和 BLAKE3 LoongArch 移植。

证据 补丁与基准一起发布,让架构支持成为用户可以运行的东西,而不是幻灯片。

小型状态估计

fast-kalman

问题 小型状态空间模型不应该承担动态矩阵或逐次 Python 调用的高额开销。

工作 固定尺寸 C++23 Kalman 变体、直接 Python 绑定,以及支持不规则时间与观测方差的批量更新。

测量 公开的二状态、单观测线性批量案例在文档所述机器上每个测量值约需 43 ns。

外部排序

bsort

问题 当定长记录数据集大于 RAM 时,局部性和缓存行为本身就成为算法。

工作 面向局部访问、可预测记录和 LRU 友好行为设计的 C++ 与 Python 外部排序器。

历史 这个实验后来成为一家创业公司的技术基础,并继续以开源形式提供。

更多系统工程

实验、移植和实用工具

有些工作最终成为服务器或库,有些工作只为回答一个狭窄的系统问题。 只要实现和证据有用,它们都应该出现在这里。

解释器内部机制

CPython SIMD

面向编解码器、文本、字节、JSON、CSV、URL 和哈希表的运行时 SIMD 实验。

数值计算

NumPy LASX

面向 Loongson 系统的 256 位 LASX 概念验证移植。

恶劣网络

mosh 补丁

Agent、套接字、SOCKS、X11 和流转发,以及采用 FEC 的大文件传输。

数据包路径分析

Latency Lab

让抓包数据通过速率、分帧、排队和压缩模型,并输出完整延迟分布。

增量图搜索

negcycle

在单个报价变化后精确分析货币循环的 SIMD Bellman-Ford 路径。

开发中

Goblin Cannon

长距离调制解调器设计,目前只在单元测试环境中验证,不宣称实地结果。

采购与分类

搜索工具

NAICSCPV 语义代码查找器。

这些工程有其来路

为什么是 Adam

我从 1989 年开始构建生产软件:曾在 Quantlab 和 Massive.com 从事量化与行情系统, 在 S&P Global 处理大规模金融数据,也在 Google 和 Amazon 从事大规模工程。

开源工作把这条路线搬到公众面前。我构建实现、基准工具和解释结果所需的证据, 说明什么变好了、什么没有,以及原因是什么。

性能工程不是一袋技巧。它要求对完整系统认真记账,然后改变真正拥有成本的那一层。

Goblin Reactor

把棘手的系统问题带给我

我用开放系统证明能力。Goblin Reactor 把这些能力带进客户系统:应用运行时、 数据库、内存、存储、网络、原生代码和生产行为。

告诉我哪里慢
电子邮件
f"{given_name.lower()}.{family_name.lower()}@gmail.com"
电话
f'{2**8}-{2*3**2*37}-{13*101}'
GitHub
github.com/adamdeprince
开发笔记
adamdeprince.com/zh-CN/blog