如果你写过几年代码,大概率被这两句话轮番鞭打过:「要面向对象,抽象要优雅」和「这接口怎么这么慢」。这两句话经常打架,而多数人的处理方式是装作没看见——直到某天凌晨三点,性能告警把你叫醒。
2014年的 CppCon 大会上,时任 Insomniac Games 技术总监的 Mike Acton 上台做了一场演讲,标题叫《Data-Oriented Design and C++》。这场演讲在过去十年里被反复引用,成了程序员圈子里著名的「反面向对象檄文」。但如果你只把它当成「OOP 批判大会」,那就看浅了。它真正讲的是一件更根本的事:程序的本质是数据的变换,而数据在真实硬件上的搬运成本,决定了你代码的天花板。
十年过去,这场演讲不但没过时,反而在 AI 时代显得更扎心了——今天所有大模型推理的瓶颈,恰恰就是内存带宽。你训练完一个大模型,推理时每生成一个 token 都要把权重从显存里搬出来一遍,搬不动,模型再聪明也白搭。Acton 十年前喊的那句「理解你的硬件」,在 2026 年听起来像预言。
这一篇,我们就把这堂课拆开揉碎,看看它到底讲了什么,哪些是它的高见,哪些需要打折扣。
| 项目 | 内容 |
|---|---|
| 视频标题 | Data-Oriented Design and C++ |
| 演讲者 | Mike Acton(时任 Insomniac Games 技术总监) |
| 频道 | CppCon 官方频道 |
| 发布时间 | 2014年秋,CppCon 2014 大会(美国贝尔维尤) |
| 时长 | 约62分钟 |
| 播放量 | 百万级(程序员社区常青经典,长期被引用;精确数字以频道页为准) |
| 核心主题 | 面向数据设计(Data-Oriented Design, DOD):程序是数据变换,性能来自对硬件与数据布局的理解 |
Acton 的开场没寒暄,直接开炮。他的演讲组织方式很特别——整场由一连串「Claim(主张)」构成,每抛一个主张就展开论证,像写论文一样做演讲。他开场时说的大意是:大多数软件问题不是新问题,你遇到的问题别人早遇到过一万遍;而程序员最大的毛病,是以为自己在做创造性工作,从而获得了跳过基础功课的许可。
(延伸分析)这个开场策略本身值得学。技术演讲最容易犯的错是「知识炫耀」——讲一堆结论不给推理路径。Acton 反其道而行,把自己的立场拆成一串可被反驳的主张,逐条给证据。你可以不同意他,但你必须先反驳他的论证,而不是感觉。这种「主张驱动」的演讲结构,比 PPT 上十个要点更让人记住。
全场的理论基石是这句话(视频原话,大意):The purpose of all programs, and all parts of the programs, is to transform data. 所有程序、程序的每一个部分,目的都是变换数据。不是「用对象建模世界」,不是「发现优雅的抽象」,就是搬运和变换数据:网页是把数据库里的记录变成 HTML,游戏是把玩家输入变成下一帧像素,编译器是把源码变成机器码。
他还讲了一个流传很广的梗(大意):Excel 可能是有史以来最好的编程语言之一——因为无数不懂「编程」的会计和分析师,用它真实地解决了数据变换问题,而不是在纠结用什么设计模式。
(延伸分析)这个视角的杀伤力在于换了计价单位。OOP 用「抽象质量」给代码计价,DOD 用「数据吞吐」给代码计价。计价单位一换,很多争论自动消解:一个类设计得再优雅,如果它迫使 CPU 每 64 字节就要去主存取一次数据,它就是慢的。当然要公平地说,这不是让你抛弃抽象,而是提醒你:抽象是手段,数据变换才是交付物。
第二个主张(视频原话,大意):Solve problems, not write code. 你被雇佣是来解决问题的,写代码只是手段之一。Acton 说他面试时常问应聘者「你最近一次做调研是什么时候」,很多资深程序员答不上来——他们拿到问题就直接开写,跳过了查资料、查硬件手册、做实验这一步。
他以游戏行业举例:解决「角色如何在复杂地形上移动」这个问题,可能根本不需要写新代码,也许换个数据格式、换个现成算法就解决了。而直接动手写代码的人,往往是在用代码掩饰自己没搞懂问题。
(延伸分析)这条在 AI 时代有了新注脚。2026 年的今天,AI 写代码的成本趋近于零,「直接开写」的诱惑比 2014 年大了一个数量级——反正生成很快,不对就重来。但 Acton 的警告反而更准了:当写代码廉价,理解和定义问题就成了唯一稀缺的环节。问题定义错了,AI 只会用更快的速度产出错误答案。
这是全场技术密度最高的部分。Acton 拿出一组经典数字(常被归到 Jeff Dean 的「每个程序员都该知道的延迟数」名下,量级示意):CPU 访问 L1 缓存约 1 纳秒,访问主存约 100 纳秒,访问 SSD 要几十微秒,机械硬盘寻道约 10 毫秒。把这组数字放大到人类尺度(1 纳秒当 1 秒):L1 就是「伸手从桌上拿东西」,主存是「下楼取个快递(约两分钟)」,SSD 是「等一天」,机械盘是「等四个月」。
他强调 CPU 与内存的速度差还在扩大——这个现象在体系结构界有个正式名字:memory wall(内存墙),1995 年 Wulf 和 McKee 的论文《Hitting the Memory Wall》就发出了警告。缓存行是 64 字节:CPU 不按字节取数,按 64 字节的块取。你的程序慢,多数时候不是算法差,而是它总在强迫 CPU「下楼取快递」。
(延伸分析)给不熟悉的朋友补个背景:所谓缓存未命中(cache miss),就是 CPU 要的数据不在近旁缓存里,必须去主存取。一次 miss 的代价大约等于几百次 L1 访问。高性能优化的本质,就是尽量让数据在被用到之前,已经恰好躺在缓存里。这不需要你成为硬件专家,只需要你记住两件事:顺序访问快,随机访问慢;搬得少,就搬得快。
理论讲完,Acton 给了三件具体的武器。第一件是 AoS 与 SoA 之争。传统写法是 Array of Structures——一百万个粒子,每个粒子是一个包含位置、速度、颜色等字段的大结构体。问题是:更新逻辑往往只用到其中两三个字段,但 CPU 按缓存行取数,每次都要把整个大结构体拖进缓存,八成的搬运是浪费。改成 Structure of Arrays——把所有粒子的 x 坐标放一个数组、y 坐标放一个数组——更新时数据连续排布,缓存行满载有用数据,CPU 预取器工作顺畅,还能被 SIMD 一次处理多个。
第二件是结构体对齐与填充:字段声明顺序不同,结构体大小可能差出一截(如 bool 加 double 再加 bool 的经典排列会造成空洞,重排即可省内存)——这是常见示例,各语言细节不同。第三件是位压缩(bit packing)与数据归一化:一个取值永远在 0–100 的数值,没必要用 32 位存;方向向量可以归一化后只存角度。视频里他反复说一个词:normalize your data——把数据变「窄」,因为带宽永远是最贵的。
有人说 DOD 是游戏行业的歪门邪道,Acton 的回答是:你自己算算账。60 帧每秒意味着每一帧只有约 16.6 毫秒的预算——渲染、物理、AI、音频全在里面。主存随机访问一次就是 100 纳秒起步,一帧里累计几千次 miss 就是零点几毫秒蒸发,几个设计失误,帧预算就爆了,玩家直接看到掉帧。游戏行业没法用「加机器」糊弄——玩家家里就那台主机。
(延伸分析)这就是 DOD 从游戏圈起源的原因:预算约束硬到无法自欺。Web 后端慢了可以加缓存加机器,游戏慢了就是掉帧,没有借口。而反过来看,今天的数据中心正在变得像游戏主机——大模型推理时显存带宽就是那 16.6 毫秒,你省不下带宽就只能花钱买卡。这也是为什么 2014 年的游戏行业经验,如今被 AI 基础设施团队反复翻出来抄作业。
演讲的收尾,Acton 把矛头指向教育:我们花四年教学生「用对象建模世界」,却不教他们数据在硬件上如何流动,这是本末倒置(视频原话,大意)。有意思的是这十年发生的事(以下为延伸梳理):面向数据的架构(ECS,Entity-Component-System)从异端变成了游戏引擎标配——Unity 推出了官方的 DOTS 技术栈(以 Entities 包为核心),暴雪在 GDC 2017 公开分享《守望先锋》基于 ECS 的 Gameplay 架构,成为该主题引用最多的分享之一。「Mechanical sympathy(机械共情)」这个词——源自赛车界、由 Martin Thompson 带进软件圈——说的也是同一件事:让代码顺着硬件的脾气写,而不是对着干。
再看更远处:列式存储数据库(把同一列的数据连续存放)本质上就是 SoA;模型量化(把权重从 FP32 压到 INT8 甚至 4 bit)本质上就是 Acton 说的 bit packing。这堂 2014 年的课,概念一个都没过时,只是换了领域继续生效。
flowchart TD
A["一条铁律<br/>程序就是数据变换"] --> B["代价从哪来<br/>硬件真相"]
A --> C["怎么办<br/>面向数据设计"]
B --> D["内存墙<br/>主存比缓存慢百倍"]
B --> E["缓存行64字节<br/>按块搬运"]
C --> F["布局<br/>SoA列式存放"]
C --> G["瘦身<br/>对齐与位压缩"]
C --> H["节奏<br/>批量与顺序访问"]
F --> I["落地形态<br/>ECS架构"]
H --> I
G --> J["2026回响<br/>模型量化与列式存储"]
D --> J
I --> K["应用场<br/>游戏引擎与GPU计算"]
写后端的同学:N+1 查询、循环里逐条 RPC,本质都是「强迫 CPU 下楼取快递」的业务版。批量取、顺序写、一次拉一页——你不需要懂寄存器,只需要记住「搬运次数比搬运总量更贵」。顺便一提,你熟悉的列式存储、Parquet 文件格式,全是 SoA 思想的工程化。
写游戏、引擎、图形的同学:这场演讲就是你们的入门必修。看完建议直接跟进两样东西:Unity 官方的 DOTS 文档(Entities 包的 Job System 与 Burst 编译器),以及 Casey Muratori 的 Performance-Aware Programming 课程——后者把「读懂汇编、看懂缓存行为」做成了系统训练。
做 AI 应用的同学:这堂课给了你一个理解推理成本的心智模型。为什么模型量化能省钱?因为把数据变窄了,带宽压力直接减半再减半——这就是 bit packing。为什么推理吞吐上不去?因为大模型解码阶段是典型的访存受限(memory-bound)场景,算力在等数据。你不需要重写 CUDA 内核,但选型时看一眼「显存带宽」和「权重体积的比值」,比看营销参数有用得多。
所有人的元启示:下次动手写代码前,先花二十分钟回答三个问题——输入数据长什么样?输出数据长什么样?中间的变换发生在哪个数量级上?这三个问题答清楚了,架构往往是自己长出来的。这正是 Acton 那句「解决问题,而不是写代码」的可操作版本。
这个视频最大的价值,是用 62 分钟把你从「写代码的人」拉回「变换数据的人」——一旦你开始按数据的形状和硬件的脾气设计程序,很多纠结多年的架构争论会自动消失。
注:文中播放量等平台数据未能实时核实,以频道页面为准;延迟数字为社区广泛引用的量级示意,不同代际硬件会有差异。
本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
