1BRC 挑战
1BRC 的全称是 The One Billion Row Challenge(十亿行挑战), 最初是由 Gunnar Morling 使用 Java 发起的,主要为了探讨现代 Java 在处理 10 亿行文本文件方面能走多远。抓住所有(虚拟)线程,使用 SIMD,优化 GC,或者使用任何其他技巧,使用最快的实现来解决这个任务,如下
编写一个程序,读取文本文件中的温度测量值,并计算每个气象站的最低、平均和最高温度。
任务看似简单,忘了告诉你,这个文件有 1,000,000,000 行!
文本结构很简单,前面是气象站,后面是测量值
Hamburg;12.0
Bulawayo;8.9
Palembang;38.8
St. John's;15.2
Cracow;12.6
...
需要打印出每个站点的最小值、平均值和最大值,按字母顺序排列,如下所示:
{
Abha=5.0/18.0/27.4,
Abidjan=15.7/26.0/34.1,
Abéché=12.1/29.4/35.6,
Accra=14.7/26.4/33.1,
Addis Ababa=2.1/16.0/24.3,
Adelaide=4.1/17.3/29.7,
...
}
1BRC 挑战赛的目标是找到完成这个任务的最快实现,并在此过程中探索现代 Java 的优势。所以,抓住所有(虚拟)线程,使用 Vector API 和 SIMD,优化 GC,利用 AOT 编译,或者使用您能想到的任何其他技巧。
.NET 已加入挑战
1BRC 的 .NET 实现由 Victor Baybekov 发起,项目地址为:
https://github.com/buybackoff/1brc
截止到 1 月 7 日 20:30,战果如下:
作者的一些优化内容如下:
使用了 Mmap 和 Span API
优化哈希函数, Utf8Span.GetHashCode
设置字典容量为 10k
手动 SIMD:查找边界并简化解析
避免零扩展,优化局部变量和循环
如果您对这个挑战感兴趣, 欢迎加入,Show me the code!
https://github.com/buybackoff/1brc