About 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
发起,项目地址为:
截止到 1 月 7 日 20:30
,战果如下:
作者的一些优化内容如下:
- 使用了
Mmap
和Span API
- 优化哈希函数,
Utf8Span.GetHashCode
- 设置字典容量为
10k
- 手动
SIMD
:查找边界并简化解析 - 避免零扩展,优化局部变量和循环
- 如果您对这个挑战感兴趣, 欢迎加入,
Show me the code!
转载声明: