十亿行挑战

对于展示非 Java 解决方案的人们,现在有一个“展示和讲述”,请检查 Rust、Go、C++ 等中的 1BRC 实现。一些有趣的相关文章包括 SQL 中的 1BRC 和 DuckDB Robin Moffatt 提出的挑战,以及 Francesco Tisiot 提出的 PostgreSQL 和 ClickHouse 中的 10 亿行挑战。

非常感谢大家的投稿,这远远超出了我的预期!由于条目数量巨大,我的评估有点落后,我会一点一点地完成它们。我还对挑战规则做了一些澄清;请务必在提交任何参赛作品之前阅读它们。

让我们开启 2024 年真正的编码风格 —​我很高兴地宣布 10 亿行挑战赛 (1BRC),将于 1 月 1 日持续至 1 月 31 日。

如果您决定接受的话,您的任务看似简单:编写一个 Java 程序,用于从文本文件中检索温度测量值并计算每个气象站的最低、平均和最高温度。只有一个警告:该文件有 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 编译,或使用您能想到的任何其他技巧。

1BRC 有一些简单的参与规则(请参阅此处了解更多详细信息):

任何提交都必须用 Java 编写

可以使用通过 SDKMan 提供的任何 Java 发行版以及来自 openjdk.net 的早期访问版本,包括针对 OpenJDK 项目(如 Valhalla)的 EA 版本

不能使用外部依赖项

要参加挑战,请从 GitHub 克隆 1brc 存储库并按照 README 文件中的说明进行操作。该任务有一个非常基本的实现,您可以将其用作比较的基线,并确保您自己的实现发出正确的结果。一旦您对工作感到满意,请针对上游存储库打开拉取请求,以提交您的实施以应对挑战。

所有提交的内容都将通过在 Hetzner Cloud CCX33 实例(8 个专用 vCPU、32 GB RAM)上运行该程序进行评估。 time 程序用于测量执行时间,即测量端到端时间。每个竞争者将连续运行五次。最慢和最快的运行将被丢弃。剩余三轮的平均值就是该竞争者的结果,并将添加到排行榜中。如果您有任何疑问或想讨论任何潜在的 1BRC 优化技术,请加入 GitHub 存储库中的讨论。

至于奖品,通过参加此挑战,您可以学到新东西,激励他人,并为看到您的名字出现在上面的记分牌中而感到自豪。有传言称获胜者还可能获得一件独特的 1️⃣🐝🏎️ T 恤。

所以不要等待,加入这一挑战,看看 Java 能有多快——我真的很好奇社区会为此提出什么建议。 2024 年快乐,编码风格!

项目Github地址: https://github.com/gunnarmorling/1brc

目前挑战排名结果

Results 结果

#Result (m:s.ms) 结果(分:秒.毫秒)Implementation 执行JDKSubmitter 提交者Notes 笔记
1.00:06.159link 关联21.0.1-graalroyvanrijn 罗伊万赖恩
2.00:06.532link 关联21.0.1-graalThomas Wuerthinger 托马斯·伍尔辛格GraalVM native binary GraalVM 原生二进制文件
3.00:07.620link 关联21.0.1-openQuan Anh Mai 关英梅
00:09.062link 关联21.0.1-openobourgain 奥布尔干
04:13.449link (baseline) 链接(基线)21.0.1-openGunnar Morling 冈纳·莫林

原文作者: 根叔

原始链接: https://www.learnhard.cn/posts/1brc-coding/

发表时间: 2024-01-09 21:00:16 +0800 CST

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可