主要观点:在处理大量数据时,在磁盘、内存、缓存和 CPU 寄存器之间移动数据是最关键路径之一,需重视数据移动成本并减少它们。
关键信息:
- 2006 年 Jim Gray 称“磁带已死,磁盘是磁带,闪存是磁盘,内存局部性为王”,但如今 CPU 操作于寄存器,寄存器局部性成为新王者,CPU 缓存的存在显示了 CPU 与内存距离之远。
- 简单算法中,数据移动顺序会影响性能,如在计数示例中,改变
for
循环顺序使性能相差 3 倍,原因是缓存未命中率不同,应增加数据局部性。 - 在数据库系统中,传统的基于运算符的查询执行模型会导致数据局部性问题,而数据中心的执行模型通过为每个查询生成专门代码来增加数据局部性,如在传感器查询示例中,数据中心的 CedarDB 比基于运算符的 DuckDB 和 ClickHouse 快近两倍。
重要细节: - 用 C++代码展示了两种不同循环顺序的计数函数
count
和countSwappedLoops
,在处理 10 亿随机整数和两个范围时,后者比前者慢 3 倍,通过查看 CPU 指令和缓存未命中率发现差异在于缓存未命中次数。 - 数据库查询中,传统模型以运算符为中心,如 PostgreSQL 或 DuckDB 会为每个运算符使用逻辑块评估查询,会导致数据在寄存器和缓存之间频繁移动,而 CedarDB 通过生成专门代码来增加数据局部性。
- 提供了基准测试代码
main.cpp
和性能事件工具Perfevent.hpp
,展示了不同方法在处理大量数据时的性能差异,包括微基准测试和数据库查询基准测试的结果。 - 给出了在 CedarDB、DuckDB 和 ClickHouse 中准备基准查询的 SQL 代码,以及实际的查询语句。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。