1brc - 十亿行挑战 —— 使用 Java 对文本文件中的 10 亿行数据进行聚合的有趣探索

Created at: 2023-12-28 17:13:24
Language: Java
License: Apache-2.0

1️🐝🏎️ ⃣ 十亿行挑战

2 月 4 日状态:最终排行榜已经发布。恭喜所有获奖者,并非常感谢所有参与本次挑战赛的人以及帮助组织这次挑战赛的每个人!

状态 2 月 3 日:所有参赛作品都已通过评估,我正在最终确定排行榜。

状态 2 月 1 日:挑战赛已关闭,接受新提交。目前不接受用于添加提交的新拉取请求。 待处理的 PR 将在未来几天内进行评估。

状态 1 月 31 日:挑战将于今天午夜 UTC 结束。

状态 1 月 12 日:由于到目前为止,此挑战赛的参赛作品数量如此之多(100+),并且越来越难以管理,因此,如果你希望它们在 10 秒或更短的时间内在评估机器上运行,请仅创建新的提交。

状态 1 月 1 日:此挑战赛开放提交

赞助

非常感谢我的雇主 Decodable 为评估环境提供资金并支持这一挑战!

十亿行挑战 (1BRC) 是一个有趣的探索,探索现代 Java 在从文本文件中聚合 10 亿行可以走多远。 获取所有(虚拟)线程,联系 SIMD,优化 GC 或使用任何其他技巧,并创建最快的实现来解决此任务!

1BRC公司

该文本文件包含一系列气象站的温度值。 每行都是一个测量值,其格式为 ,测量值正好有一个小数位。 下面以 10 行为例:

<string: station name>;<double: measurement>

Hamburg;12.0
Bulawayo;8.9
Palembang;38.8
St. John's;15.2
Cracow;12.6
Bridgetown;26.9
Istanbul;6.2
Roseau;34.4
Conakry;31.2
Istanbul;23.0

任务是编写一个 Java 程序,该程序读取文件,计算每个气象站的最小、平均和最大温度值,并在 stdout 上发出如下结果 (即按电台名称的字母顺序排序,每个电台的结果值格式为 ,四舍五入为一个小数位):

<min>/<mean>/<max>

{Abha=-23.0/18.0/59.2, Abidjan=-16.2/26.0/67.3, Abéché=-10.0/29.4/69.0, Accra=-10.1/26.4/66.4, Addis Ababa=-23.7/16.0/67.0, Adelaide=-27.8/17.3/58.5, ...}

在 2024 年 1 月 31 日之前提交你的实施并成为排行榜的一部分!

结果

这些是在 Hetzner AX161 专用服务器的 8 个内核(32 核 AMD EPYC™ 7502P (Zen2),128 GB RAM)上运行所有参赛作品的结果。

# 结果 (m:s.ms) 实现 京德KK的 提交者 笔记 证书
1 00:01.535 链接 21.0.2-格拉尔 Thomas WuerthingerQuan Anh MaiAlfonso² Peterssen GraalVM 本机二进制文件,使用 Unsafe 证书
2 00:01.587 链接 21.0.2-格拉尔 Artsiom Korzun(阿尔西奥姆·科尔尊酒店) GraalVM 本机二进制文件,使用 Unsafe 证书
3 00:01.608 链接 21.0.2-格拉尔 雅罗米尔·哈马拉 GraalVM 本机二进制文件,使用 Unsafe 证书
00:01.880 链接 21.0.1-打开 塞尔坎·厄扎尔 使用不安全 证书
00:01.921 链接 21.0.2-格拉尔 Van Phu DO(文富多酒店) GraalVM 本机二进制文件,使用 Unsafe 证书
00:02.018 链接 21.0.2-格拉尔 斯蒂芬·冯·沃利 GraalVM 本机二进制文件,使用 Unsafe 证书
00:02.157 链接 21.0.2-格拉尔 罗伊·范·莱恩 GraalVM 本机二进制文件,使用 Unsafe 证书
00:02.319 链接 21.0.2-格拉尔 亚武兹·塔斯 GraalVM 本机二进制文件,使用 Unsafe 证书
00:02.332 链接 21.0.2-格拉尔 马尔科·托波尔尼克 GraalVM 本机二进制文件,使用 Unsafe 证书
00:02.367 链接 21.0.1-打开 泉英迈 使用不安全 证书
00:02.507 链接 21.0.1-打开 戈尼克斯 使用不安全 证书
00:02.557 链接 21.0.1-打开 尤尔瓦斯 使用不安全 证书
00:02.820 链接 22.EA.32-开放 李琳 使用不安全 证书
00:02.995 链接 21.0.2-格拉尔 蒂夫福阿 GraalVM 本机二进制文件,使用 Unsafe 证书
00:02.997 链接 21.0.1-打开 戈尼克斯 证书
00:03.095 链接 21.0.2-格拉尔 贾马尔·穆拉 GraalVM 本机二进制文件,使用 Unsafe 证书
00:03.210 链接 21.0.1-打开 泉英迈 证书
00:03.298 链接 21.0.1-格拉尔 苏布拉曼亚姆 使用不安全 证书
00:03.431 链接 21.0.1-格拉尔 罗曼·穆辛 GraalVM 本机二进制文件,使用 Unsafe 证书
00:03.469 链接 21.0.2-格拉尔 埃利奥特·巴拉斯 GraalVM 本机二进制文件,使用 Unsafe 证书
00:03.698 链接 21.0.1-格拉尔 杰森·诺克林 证书
00:03.785 链接 21.0.2-格拉尔 泽尔宁夫 GraalVM 本机二进制文件,使用 Unsafe 证书
00:03.820 链接 21.0.2-格拉尔 约翰·齐亚莫斯 GraalVM 本机二进制文件,使用 Unsafe 证书
00:03.902 链接 21.0.1-打开 胡安·帕雷拉 证书
00:03.966 链接 21.0.1-打开 何金聪 使用不安全 证书
00:03.991 链接 21.0.1-格拉尔 Vaidhy Mayilrangam(瓦伊迪·马伊兰甘) 使用不安全 证书
00:04.066 链接 21.0.1-打开 杰西·范鲁伊 使用不安全 证书
00:04.101 链接 21.0.2-格拉尔 海梅·波利杜拉 GraalVM 本机二进制文件,使用 Unsafe 证书
00:04.209 链接 21.0.1-打开 乔瓦尼·库库(Giovanni Cuccu) 证书
00:04.474 链接 21.0.1-打开 罗曼·斯托菲尔 证书
00:04.676 链接 21.0.2-TEM 彼得·莱瓦特 证书
00:04.684 链接 21.0.1-打开 弗洛林·布拉纳鲁 使用不安全 证书
00:04.701 链接 21.0.1-打开 伊恩·普雷斯顿博士 证书
00:04.741 链接 21.0.1-打开 悬崖点击 使用不安全 证书
00:04.800 链接 21.0.1-打开 帕克·蒂明斯 证书
00:04.884 链接 21.0.1-打开 阿列克谢·希皮勒夫 证书
00:04.920 链接 21.0.1-格拉尔 苏布拉曼亚姆 证书
00:05.077 链接 21.0.2-格拉尔 乔纳森·赖特 GraalVM 本机二进制文件,使用 Unsafe 证书
00:05.142 链接 21.0.1-打开 Arjen Wisse(阿简·威斯) 证书
00:05.167 链接 21.0.2-打开 叶夫赫尼·梅尔尼克 证书
00:05.235 链接 21.0.1-打开 无限 证书
00:05.336 链接 爪哇岛 苏米特·乔杜里 使用不安全 证书
00:05.354 链接 21.0.2-格拉尔 阿尔曼·谢里夫 GraalVM 本机二进制文件,使用 Unsafe 证书
00:05.478 链接 21.0.1-打开 奥利维尔·布尔甘(Olivier Bourgain) 使用不安全 证书
00:05.559 链接 21.0.1-格拉尔 帕纳吉奥蒂斯·德拉卡托斯 GraalVM 本机二进制文件 证书
00:05.887 链接 21.0.1-格拉尔 查理·埃文斯 使用不安全 证书
00:05.979 链接 21.0.1-格拉尔 山姆·普拉拉 证书
00:06.166 链接 21.0.1-打开 杰米·斯坦斯菲尔德 证书
00:06.257 链接 21.0.1-格拉尔 斯蒂芬·斯普伦格 使用不安全 证书
00:06.392 链接 21.0.2-格拉尔 迭戈·帕拉 证书
00:06.576 链接 21.0.1-打开 孙安德 使用不安全 证书
00:06.635 链接 21.0.1-格拉尔 拉克·斯卡特斯-格瓦西 GraalVM 本机二进制文件,使用 Unsafe 证书
00:06.654 链接 21.0.1-格拉尔 雅罗斯拉夫·巴乔里克 证书
00:06.715 链接 21.0.1-打开 阿尔吉尔达斯·拉什丘斯 证书
00:06.884 链接 21.0.1-格拉尔 rcasteltrione 证书
00:06.982 链接 21.0.1-打开 克里斯·贝柳 证书
00:07.563 链接 21.0.1-格拉尔 3J5A型 证书
00:07.680 链接 21.0.1-格拉尔 木糖醇 使用不安全 证书
00:07.712 链接 21.0.1-格拉尔 安妮塔·SV 证书
00:07.730 链接 21.0.1-打开 约翰内斯·舒特(Johannes Schüth) 证书
00:07.894 链接 21.0.2-TEM 安东尼奥·穆尼奥斯 证书
00:07.925 链接 21.0.1-格拉尔 里卡多·皮珀(Ricardo Pieper) 证书
00:07.948 链接 爪哇岛 斯莫菲 使用不安全 证书
00:08.157 链接 21.0.1-打开 尤伦伊万 证书
00:08.167 链接 21.0.1-TEM 迪米塔尔·季米特洛夫 证书
00:08.214 链接 21.0.1-打开 迪姆肯 证书
00:08.255 链接 21.0.1-打开 马蒂亚斯·比耶克 证书
00:08.398 链接 21.0.1-打开 帕斯·穆加尔 使用不安全 证书
00:08.489 链接 21.0.1-格拉尔 阮邦 证书
00:08.517 链接 21.0.1-格拉尔 AGS公司 使用不安全 证书
00:08.557 链接 21.0.1-格拉尔 阿德里亚·卡贝萨 证书
00:08.622 链接 21.0.1-格拉尔 凯沙夫拉姆·库杜瓦 使用不安全 证书
00:08.892 链接 21.0.1-打开 罗曼·罗曼丘克 证书
00:08.896 链接 21.0.1-打开 安杰伊·内斯托鲁克 证书
00:09.020 链接 21.0.1-打开 耶姆雷恩奇 证书
00:09.071 链接 21.0.1-打开 加布里埃尔·里德 证书
00:09.352 链接 21.0.1-格拉尔 菲利普·赫里萨福夫 证书
00:09.725 链接 21.0.2-格拉尔 马丁 GraalVM 本机二进制文件 证书
00:09.867 链接 21.0.1-格拉尔 里卡多·皮珀(Ricardo Pieper) 证书
00:09.945 链接 21.0.1-打开 安东尼·古巴德(Anthony Goubard) 证书
00:10.092 链接 21.0.1-格拉尔 布拉罕 证书
00:10.127 链接 21.0.1-打开 帕斯·穆加尔 使用不安全 证书
00:11.577 链接 21.0.1-打开 前夕 证书
00:10.473 链接 21.0.1-打开 安东·雷博奇金 证书
00:11.119 链接 21.0.1-打开 劳里 证书
00:11.156 链接 爪哇岛 Yann Moisan 证书
00:11.167 链接 21.0.1-打开 尼克·帕尔默 证书
00:11.352 链接 21.0.1-打开 卡蒂克扬97 使用不安全 证书
00:11.363 链接 21.0.2-TEM 古鲁普拉萨德·斯里达兰 证书
00:11.405 链接 21.0.1-格拉尔 拉斐尔·梅里诺·加西亚 证书
00:11.406 链接 21.0.1-格拉尔 加布里埃尔福 证书
00:11.433 链接 21.0.1-格拉尔 Jatin Gala(贾廷晚会) 证书
00:11.505 链接 21.0.1-打开 德米特里·布菲斯托夫 使用不安全 证书
00:11.744 链接 21.0.2-TEM 塞巴斯蒂安·勒夫达尔 证书
00:11.805 链接 21.0.1-格拉尔 Cool_Mineman 证书
00:11.934 链接 21.0.1-打开 arjenvaneerde 证书
00:12.220 链接 21.0.1-打开 理查德·斯塔廷 证书
00:12.495 链接 21.0.1-格拉尔 塞缪尔·伊冯 GraalVM 本机二进制文件 证书
00:12.568 链接 21.0.1-格拉尔 弗拉德 证书
00:12.800 链接 爪哇岛 约纳坦·格拉伯 证书
00:13.013 链接 21.0.1-格拉尔 清阳 证书
00:13.071 链接 21.0.1-打开 伊恩·普雷斯顿博士 证书
00:13.729 链接 爪哇岛 塞德里克·博斯 证书
00:13.817 链接 21.0.1-打开 卡 罗 证书
00:14.502 链接 21.0.1-格拉尔 埃里克卢姆 证书
00:14.772 链接 21.0.1-打开 凯文·麦克默特里 证书
00:14.867 链接 21.0.1-打开 迈克尔·贝瑞 证书
00:14.900 链接 爪哇岛 Judekeyser 证书
00:15.006 链接 爪哇岛 帕维尔·亚当斯基 证书
00:15.662 链接 21.0.1-打开 谢尔盖·莫特潘 证书
00:16.063 链接 21.0.1-打开 马雷克·科恩 证书
00:16.457 链接 21.0.1-打开 阿列克谢 证书
00:16.953 链接 21.0.1-打开 高拉夫·阿南特罗·德什穆克 证书
00:17.046 链接 21.0.1-打开 迪米特里斯·卡兰皮纳斯 证书
00:17.086 链接 爪哇岛 布雷杰什·拉索德 证书
00:17.490 链接 21.0.1-打开 格格莉之吻 证书
00:17.255 链接 21.0.1-打开 特科萨切夫 证书
00:17.520 链接 21.0.1-打开 法里德 证书
00:17.717 链接 21.0.1-打开 奥列·马尔琴科 证书
00:17.815 链接 21.0.1-打开 哈尔瓦德·特莱特贝格 证书
00:17.932 链接 21.0.1-打开 Bartłomiej Pietrzyk 证书
00:18.251 链接 21.0.1-格拉尔 马库斯·埃布纳 证书
00:18.448 链接 21.0.1-打开 莫伊塞斯·博尔赫斯·富尔塔多 证书
00:18.771 链接 21.0.1-格拉尔 大卫·科佩克 证书
00:18.902 链接 21.0.1-格拉尔 马克西姆 证书
00:19.357 链接 21.0.1-格拉尔斯 罗曼·施韦策 证书
00:20.691 链接 21.0.1-格拉尔 像孩子一样 GraalVM 本机二进制文件 证书
00:21.989 链接 21.0.1-打开 勇气 证书
00:22.188 链接 21.0.1-打开 海罗·格拉特隆 证书
00:22.334 链接 21.0.1-打开 阿尔贝托·文图里尼 证书
00:22.457 链接 21.0.1-打开 拉姆齐·本·叶海亚 证书
00:22.471 链接 21.0.1-打开 希瓦姆·阿加瓦尔 证书
00:24.986 链接 21.0.1-打开 库马尔索拉夫123 证书
00:25.064 链接 21.0.2-打开 苏迪尔·图马蒂 证书
00:26.500 链接 21.0.1-打开 布鲁诺·费利克斯 证书
00:28.381 链接 21.0.1-打开 汉普斯 证书
00:29.741 链接 21.0.1-打开 马泰奥·瓦卡里(Matteo Vaccari) 证书
00:32.018 链接 21.0.1-打开 奥勒良·图图亚努 证书
00:34.388 链接 21.0.1-TEM 托比 证书
00:35.875 链接 21.0.1-打开 马哈茂德·法兹哈利勒 证书
00:36.180 链接 21.0.1-打开 霍里亚·基奥雷安 证书
00:36.424 链接 爪哇岛 马尼什·加格 证书
00:38.340 链接 21.0.1-打开 摘要假面 证书
00:41.982 链接 21.0.1-打开 克里斯·里科米尼 证书
00:42.893 链接 21.0.1-打开 贾瓦马克 证书
00:46.597 链接 21.0.1-打开 前田先生 证书
00:58.811 链接 21.0.1-打开 乌吉瓦尔·巴蒂 证书
01:05.094 链接 21.0.1-打开 穆迪特·萨克塞纳 证书
01:05.979 链接 21.0.1-格拉尔 Hieu Dao Quang(傅道光酒店) 证书
01:06.790 链接 21.0.1-打开 卡尔·海因茨·马尔拜斯 证书
01:06.944 链接 21.0.1-打开 桑塔努 证书
01:07.014 链接 21.0.1-打开 行人之爱 证书
01:07.101 链接 21.0.1-打开 吉夫约特·辛格·查布达 证书
01:08.811 链接 21.0.1-打开 阿莱什·贾斯汀 证书
01:08.908 链接 21.0.1-打开 伊塔斯克 证书
01:09.595 链接 21.0.1-TEM 安东尼奥·贡萨尔维斯 证书
01:09.882 链接 21.0.1-打开 帕布 R 证书
01:14.815 链接 21.0.1-打开 二难之物 证书
01:25.801 链接 21.0.1-打开 伊万克拉里克 证书
01:33.594 链接 21.0.1-打开 高拉夫·马图尔 证书
01:53.208 链接 爪哇岛 马哈德夫 K 证书
01:56.607 链接 21.0.1-打开 阿比拉什 证书
03:43.521 链接 21.0.1-打开 김예환 Ye-Hwan Kim (山姆) 证书
03:59.760 链接 21.0.1-打开 参 孙 证书
---
04:49.679 link (基线) 21.0.1-打开 贡纳尔·莫林

请注意,我在管理竞争者的方式上并不是超级科学的 (有关详细信息,请参阅评估结果)。 这不是一个高保真微基准测试,运行之间可能会有高达 +-3% 的变化。 因此,与附近的其他人相比,不要太纠结于你的条目的确切顺序。 这项挑战的主要目的是学习新事物,在此过程中获得乐趣,并激励其他人也这样做。 排行榜只是实现这一目标的手段。 但是,如果你观察到截然不同的结果,请打开一个问题。

请参阅进入挑战赛,了解如何通过自己的实施进入挑战赛Show & Tell 具有使用其他语言、数据库和工具构建的各种 1BRC 条目。

奖金结果

本部分列出了使用不同配置运行最快的 N 个条目的结果。 由于参赛作品已针对原始挑战描述和设置的特定条件进行了优化 (例如密钥集的大小), 挑战条目在不同配置中的表现可能大不相同。 此处提供的这些奖金结果仅供参考。 对于 1BRC 挑战,只有上一节中的结果才重要。

32 核 / 64 线程

为了正式评估挑战赛的参赛作品,每个竞争者都在评估机器(AMD EPYC™ 7502P)的八个内核上运行。 以下是在计算机的所有 32 个内核/64 个线程(即启用 SMT)上运行前 50 个条目(截至提交 e1fb378a,2 月 2 日)的结果:

# 结果 (m:s.ms) 实现 京德KK的 提交者 笔记
1 00:00.323 链接 21.0.2-格拉尔 雅罗米尔·哈马拉 GraalVM 本机二进制文件,使用 Unsafe
2 00:00.326 链接 21.0.2-格拉尔 Thomas WuerthingerQuan Anh MaiAlfonso² Peterssen GraalVM 本机二进制文件,使用 Unsafe
3 00:00.349 链接 21.0.2-格拉尔 Artsiom Korzun(阿尔西奥姆·科尔尊酒店) GraalVM 本机二进制文件,使用 Unsafe
00:00.351 链接 21.0.2-格拉尔 Van Phu DO(文富多酒店) GraalVM 本机二进制文件,使用 Unsafe
00:00.389 链接 21.0.2-格拉尔 斯蒂芬·冯·沃利 GraalVM 本机二进制文件,使用 Unsafe
00:00.408 链接 21.0.2-格拉尔 亚武兹·塔斯 GraalVM 本机二进制文件,使用 Unsafe
00:00.415 链接 21.0.2-格拉尔 罗伊·范·莱恩 GraalVM 本机二进制文件,使用 Unsafe
00:00.499 链接 21.0.2-格拉尔 马尔科·托波尔尼克 GraalVM 本机二进制文件,使用 Unsafe
00:00.602 链接 21.0.1-格拉尔 罗曼·穆辛 GraalVM 本机二进制文件,使用 Unsafe
00:00.623 链接 21.0.1-打开 戈尼克斯 使用不安全
00:00.710 链接 21.0.2-格拉尔 贾马尔·穆拉 GraalVM 本机二进制文件,使用 Unsafe
00:00.727 链接 21.0.2-格拉尔 蒂夫福阿 GraalVM 本机二进制文件,使用 Unsafe
00:00.774 链接 21.0.1-打开 塞尔坎·厄扎尔 使用不安全
00:00.788 链接 21.0.2-格拉尔 埃利奥特·巴拉斯 GraalVM 本机二进制文件,使用 Unsafe
00:00.832 链接 21.0.2-格拉尔 泽尔宁夫 GraalVM 本机二进制文件,使用 Unsafe
00:00.840 链接 21.0.1-打开 戈尼克斯
00:00.857 链接 21.0.2-格拉尔 海梅·波利杜拉 GraalVM 本机二进制文件,使用 Unsafe
00:00.880 链接 21.0.2-格拉尔 约翰·齐亚莫斯 GraalVM 本机二进制文件,使用 Unsafe
00:00.939 链接 21.0.1-打开 阿列克谢·希皮勒夫
00:01.026 链接 21.0.1-打开 杰西·范鲁伊 使用不安全
00:01.118 链接 21.0.2-格拉尔 乔纳森·赖特 GraalVM 本机二进制文件
00:01.140 链接 21.0.2-格拉尔 阿尔曼·谢里夫 GraalVM 本机二进制文件,使用 Unsafe
00:01.143 链接 21.0.1-打开 悬崖点击 使用不安全
00:01.169 链接 21.0.2-打开 叶夫赫尼·梅尔尼克
00:01.188 链接 21.0.1-格拉尔 苏布拉曼亚姆 使用不安全
00:01.193 链接 21.0.1-打开 弗洛林·布拉纳鲁 使用不安全
00:01.234 链接 21.0.1-打开 奥利维尔·布尔甘(Olivier Bourgain) 使用不安全
00:01.242 链接 21.0.1-打开 泉英迈 使用不安全
00:01.252 链接 21.0.1-打开 何金聪 使用不安全
00:01.267 链接 22.EA.32-开放 李琳 使用不安全
00:01.363 链接 21.0.2-TEM 彼得·莱瓦特
00:01.380 链接 21.0.1-格拉尔 杰森·诺克林
00:01.391 链接 21.0.1-打开 泉英迈
00:01.439 链接 21.0.1-打开 Arjen Wisse(阿简·威斯)
00:01.446 链接 21.0.1-打开 伊恩·普雷斯顿博士
00:01.504 链接 21.0.1-打开 杰米·斯坦斯菲尔德
00:01.514 链接 21.0.1-格拉尔 苏布拉曼亚姆
00:01.516 链接 21.0.1-格拉尔 Vaidhy Mayilrangam(瓦伊迪·马伊兰甘) 使用不安全
00:01.586 链接 21.0.1-打开 尤尔瓦斯 使用不安全
00:01.647 链接 21.0.2-格拉尔 迭戈·帕拉
00:01.694 链接 21.0.1-打开 帕克·蒂明斯
00:01.694 链接 21.0.1-格拉尔 查理·埃文斯 使用不安全
00:01.702 链接 21.0.1-格拉尔 山姆·普拉拉
00:01.733 链接 爪哇岛 苏米特·乔杜里 使用不安全
00:01.742 链接 21.0.1-打开 无限
00:02.241 链接 21.0.1-格拉尔 斯蒂芬·斯普伦格 使用不安全
00:02.294 链接 21.0.1-打开 乔瓦尼·库库(Giovanni Cuccu)
00:02.990 链接 21.0.1-格拉尔 帕纳吉奥蒂斯·德拉卡托斯 GraalVM 本机二进制文件
00:03.205 链接 21.0.1-打开 胡安·帕雷拉
00:10.929 链接 21.0.1-打开 罗曼·斯托菲尔

10K 键组

1BRC 挑战数据集包含 413 个不同的气象站,而规则允许出现 10,000 个不同的气象站名称。 以下是针对 10K 站点(通过 ./create_measurements3.sh 1000000000 创建)的 1,000,000,000 个测量值运行前 40 个条目(截至提交 e1fb378a,2 月 2 日)的结果, 在评估计算机上使用八个内核:

# 结果 (m:s.ms) 实现 京德KK的 提交者 笔记
1 00:02.957 链接 21.0.2-格拉尔 Artsiom Korzun(阿尔西奥姆·科尔尊酒店) GraalVM 本机二进制文件,使用 Unsafe
2 00:03.058 链接 21.0.2-格拉尔 马尔科·托波尔尼克 GraalVM 本机二进制文件,使用 Unsafe
3 00:03.186 链接 21.0.2-格拉尔 斯蒂芬·冯·沃利 GraalVM 本机二进制文件,使用 Unsafe
00:03.998 链接 21.0.2-格拉尔 罗伊·范·莱恩 GraalVM 本机二进制文件,使用 Unsafe
00:04.042 链接 21.0.2-格拉尔 雅罗米尔·哈马拉 GraalVM 本机二进制文件,使用 Unsafe
00:04.289 链接 21.0.1-打开 戈尼克斯 使用不安全
00:04.522 链接 21.0.2-格拉尔 蒂夫福阿 GraalVM 本机二进制文件,使用 Unsafe
00:04.653 链接 21.0.2-格拉尔 贾马尔·穆拉 GraalVM 本机二进制文件,使用 Unsafe
00:04.733 链接 21.0.1-打开 戈尼克斯
00:04.836 链接 21.0.1-格拉尔 苏布拉曼亚姆 使用不安全
00:04.870 链接 21.0.2-格拉尔 Thomas WuerthingerQuan Anh MaiAlfonso² Peterssen GraalVM 本机二进制文件,使用 Unsafe
00:05.240 链接 21.0.2-格拉尔 泽尔宁夫 GraalVM 本机二进制文件,使用 Unsafe
00:05.394 链接 21.0.2-格拉尔 亚武兹·塔斯 GraalVM 本机二进制文件,使用 Unsafe
00:05.906 链接 21.0.2-格拉尔 埃利奥特·巴拉斯 GraalVM 本机二进制文件,使用 Unsafe
00:06.086 链接 21.0.2-格拉尔 Van Phu DO(文富多酒店) GraalVM 本机二进制文件,使用 Unsafe
00:06.379 链接 21.0.2-格拉尔 约翰·齐亚莫斯 GraalVM 本机二进制文件,使用 Unsafe
00:07.113 链接 21.0.2-打开 叶夫赫尼·梅尔尼克
00:07.542 链接 21.0.2-格拉尔 乔纳森·赖特 GraalVM 本机二进制文件
00:07.889 链接 21.0.1-打开 弗洛林·布拉纳鲁 使用不安全
00:07.970 链接 21.0.1-打开 悬崖点击 使用不安全
00:08.857 链接 21.0.1-打开 塞尔坎·厄扎尔
00:09.333 链接 21.0.1-打开 尤尔瓦斯 使用不安全
00:09.722 链接 21.0.1-打开 阿列克谢·希皮勒夫
00:09.777 链接 21.0.1-格拉尔 Vaidhy Mayilrangam(瓦伊迪·马伊兰甘) 使用不安全
00:10.263 链接 21.0.1-打开 泉英迈 使用不安全
00:11.154 链接 21.0.1-打开 帕克·蒂明斯
00:13.175 链接 21.0.1-打开 泉英迈
00:13.245 链接 21.0.1-打开 伊恩·普雷斯顿博士
00:13.377 链接 21.0.1-打开 乔瓦尼·库库(Giovanni Cuccu)
00:13.761 链接 21.0.1-打开 胡安·帕雷拉
00:14.441 链接 21.0.2-TEM 彼得·莱瓦特
00:15.548 链接 21.0.1-打开 何金聪 使用不安全
00:17.906 链接 21.0.1-格拉尔 杰森·诺克林
00:18.770 链接 22.EA.32-开放 李琳 使用不安全
00:19.106 链接 21.0.1-打开 罗曼·斯托菲尔
00:20.151 链接 21.0.1-格拉尔 罗曼·穆辛 GraalVM 原生二进制文件,使用 Unsafe;偶尔出现SEG断层
00:22.953 链接 21.0.2-格拉尔 海梅·波利杜拉 GraalVM 本机二进制文件,使用 Unsafe
---
DNF网络 链接 21.0.1-打开 杰西·范鲁伊 输出不正确
DNF网络 链接 21.0.1-格拉尔 苏布拉曼亚姆 未在 60 秒内完成
DNF网络 链接 21.0.1-打开 Arjen Wisse(阿简·威斯) 输出不正确

先决条件

必须在系统上安装 Java 21

挑战赛

此存储库包含两个程序:

  • dev.morling.onebrc.CreateMeasurements
    (通过 create_measurements.sh 调用):在此项目的根目录中创建文件measurements.txt,其中包含可配置数量的随机测量值
  • dev.morling.onebrc.CalculateAverage
    (通过 calculate_average_baseline.sh 调用):计算文件measurements.txt的平均值

执行以下步骤以运行质询:

  1. 使用 Apache Maven 构建项目:

    ./mvnw clean verify
    
  2. 创建包含 1B 行的测量文件(只需一次):

    ./create_measurements.sh 1000000000
    

    这将需要几分钟时间。注意:生成的文件的大小约为 12 GB,因此请确保有足够的磁盘空间。

    如果你使用非 Java 语言运行质询,则可以使用一个非权威的 Python 脚本来生成测量文件。生成测量值的权威方法是 Java 程序 。

    src/main/python/create_measurements.py
    dev.morling.onebrc.CreateMeasurements

  3. 计算平均测量值:

    ./calculate_average_baseline.sh
    

    提供的朴素示例实现使用 Java 流 API 处理文件,并在用于结果评估的环境中在 ~2 分钟内完成任务。 它作为比较你自己的实现的基线。

  4. 优化它:

    以你认为合适的任何方式调整程序以加快速度(只需遵守下面描述的一些规则)。 选项包括并行计算、使用(孵化)Vector API、同时对文件的不同部分进行内存映射、使用 AppCDS、GraalVM、CRaC 等来加速应用程序启动、选择和调整垃圾收集器等等。

    CalculateAverage

火焰图/剖面图

一个提示是,如果你安装了 jbang,你可以通过 ap-loader 运行 async-profiler 来获取程序的火焰图:

jbang --javaagent=ap-loader@jvm-profiling-tools/ap-loader=start,event=cpu,file=profile.html -m dev.morling.onebrc.CalculateAverage_yourname target/average-1.0.0-SNAPSHOT.jar

或直接在 .java 文件上:

jbang --javaagent=ap-loader@jvm-profiling-tools/ap-loader=start,event=cpu,file=profile.html src/main/java/dev/morling/onebrc/CalculateAverage_yourname

当你运行此操作时,它将在profile.html中生成火焰图。然后,你可以在浏览器中打开它,并查看你的程序将时间花在哪里。

规则和限制

  • 可以使用以下任何 Java 发行版:
    • SDKMan 提供的任何构建
    • 可以使用 openjdk.net 上可用的抢先体验版本(包括用于 OpenJDK 项目(如 Valhalla 的 EA 版本)
    • 基于 builds.shipilev.net 构建 如果你想使用无法通过这些渠道获得的构建,请联系我们讨论是否可以考虑使用。
  • 不能使用外部库依赖项
  • 实现必须作为单个源文件提供
  • 计算必须在应用程序运行时进行,即你不能在构建时(例如,使用 GraalVM 时)处理测量文件,而只是将结果烘焙到二进制文件中
  • 输入值范围如下:
    • 站名:非空 UTF-8 字符串,最小长度为 1 个字符,最大长度为 100 个字节,不包含 NOR 字符。(即,这可以是 100 个单字节字符,或 50 个双字节字符等)
      ;
      \n
    • 温度值:介于 -99.9(含)和 99.9(含)之间的非空双精度,始终使用一个小数位
  • 最多有 10,000 个唯一的站名
  • 文件中的行尾是所有平台上的字符
    \n
  • 实现不得依赖于给定数据集的细节,例如,根据上述约束条件,任何有效的台站名称,并且必须支持任何数据分布(每个台站的测量次数)
  • 输出值的四舍五入必须使用 IEEE 754 舍入方向“roundTowardPositive”的语义完成

参加挑战赛

要向 1BRC 提交你自己的实现,请按照以下步骤操作:

  • 创建onebrc GitHub存储库的分支。
  • 运行以将基线实现复制到你的个人文件,或手动执行此操作:
    ./create_fork.sh <your_GH_user>
    • 创建CalculateAverage_baseline.java的副本,命名为 CalculateAverage_<your_GH_user>.java,例如 CalculateAverage_doloreswilson.java
    • 创建calculate_average_baseline.sh的副本,命名为 calculate_average_<your_GH_user>.sh,例如 calculate_average_doloreswilson.sh
    • 调整该脚本,使其引用你的实现类名称。如果需要,请通过该脚本中的变量提供任何 JVM 参数。 确保脚本不会向标准输出写入除计算结果以外的任何内容。
      JAVA_OPTS
    • (可选)默认使用 OpenJDK 21。如果需要自定义 JDK 构建,请创建prepare_baseline.sh的副本,命名为 prepare_<your_GH_user>.sh,例如 prepare_doloreswilson.sh。将 SDKMAN 命令包含在 your prepare 脚本中。
      sdk use java [version]
    • (可选)如果要使用本机二进制文件 (GraalVM),请将所有必需的生成逻辑添加到prepare_<your_GH_user>.sh脚本中。
  • 加快实施速度。真的很快。
  • 通过执行 /test.sh <your_GH_user>;如果报告了任何差异,请在提交实施之前修复它们。
  • 创建针对上游存储库的拉取请求,明确说明
    • 实现类的名称。
    • 程序在系统上的执行时间及其规格(CPU、内核数、RAM)。这仅供参考,官方运行时将按如下所述确定。
  • 我将运行程序并确定其性能,如下一节所述,并将结果输入记分板。

注意:如果我对实施有疑问,我保留不评估特定提交的权利(即我不会运行你的比特币矿机;)。

如果你想与社区讨论实施 1BRC 的任何潜在想法, 你可以使用此存储库的 GitHub Discussions。 请保持友好和文明。

挑战将持续到 2024 年 1 月 31 日。 在 2024 年 1 月 31 日 23:59 UTC 之后创建的任何提交(即拉取请求)将不予考虑。

评估结果

结果是通过在 Hetzner AX161 专用服务器(32 核 AMD EPYC™ 7502P (Zen2),128 GB RAM)上运行程序来确定的。

程序从 RAM 磁盘运行(即从磁盘加载文件的 IO 开销不相关),使用计算机的 8 个内核。 每个竞争者必须通过 1BRC 测试套件 (/test.sh)。 该程序用于测量所有条目的启动脚本的执行时间,即测量端到端时间。 每个竞争者连续运行五次。 最慢和最快的运行将被丢弃。 其余三次运行的平均值是该竞争者的结果,并将添加到上面的结果表中。 完全相同的measurements.txt文件用于评估所有竞争者。 有关评估步骤的确切实现,请参阅脚本 evaluate.sh

hyperfine

如果你参加这个挑战,你可能会学到新的东西,激励他人,并为看到你的名字在上面的记分牌上列出而感到自豪。 有传言说,获胜者也可能收到一件独特的⃣ 1️🐝🏎️ T恤!

常见问题

问:我可以使用 Kotlin 或 Java 以外的其他 JVM 语言吗?
答:不可以,这个挑战只针对 Java。不过,请随意非正式地分享明显优于任何列出的结果的实现。

问:我可以使用非 JVM 语言和/或工具吗?
答:不可以,这个挑战只针对 Java。不过,请随意非正式地分享有趣的实现和结果。例如,看看 DuckDB 如何完成这项任务会很有趣。

问:我有一个实现,但它不是 Java 的。我可以在某个地方分享吗?
答:虽然非 Java 解决方案不能正式提交到挑战赛中,但欢迎你在 Show and tell GitHub 讨论区分享它们。

问:我可以使用JNI吗?
答:提交必须完全用 Java 实现,即你不能用 C/C++ 编写 JNI 胶水代码。不过,你可以通过 GraalVM 对 Java 代码进行 AOT 编译,方法是对整个应用程序进行 AOT 编译,也可以创建本机库(请参阅此处

问:measurements.txt文件的编码是什么?
答:文件使用 UTF-8 编码。

问:我可以对数据集中显示的气象站名称做出假设吗?
答:不可以,虽然数据集生成器只使用一组固定的站点名称,但任何解决方案都应使用任意 UTF-8 站点名称 (为简单起见,名称保证不包含 OR 字符)。

;
\n

问:我可以从其他提交中复制代码吗?
答:可以。挑战的主要重点是学习新事物,而不是“获胜”。当你这样做时,请注明相关来源提交的内容。请不要重新提交其他没有或只有微不足道的改进的条目。

问:使用哪个操作系统进行评估?
答:Fedora 39。

问:我的解决方案在我的机器上以 2 秒的速度运行。我是世界上最快的 1BRC-er 吗?
答:可能不是:)1BRC 结果以时钟时间报告,因此不同实现的结果仅在同一台机器上获得时具有可比性。例如,如果一个实现在 32 核工作站上比在 8 核评估实例上更快,则不允许得出任何结论。共享 1BRC 结果时,还应始终共享在同一硬件上运行基线实现的结果。

问:为什么⃣ 1️🐝🏎️?
答:这是项目名称的缩写:One Billion Row Challenge。

1BRC 网页版

外部资源列表,例如博客文章和视频,讨论 1BRC 和具体实现:

许可证

此代码库在 Apache 许可证版本 2 下可用。

行为准则

彼此优秀! 除了获胜之外,这项挑战的目的是获得乐趣并学习新事物。