这是一个存储库,它将协调对象Pascal的10亿行挑战。
十亿行挑战(1BRC)是一个有趣的探索,以探索现代物体可以将pascal推向多远,以从文本文件中汇总10亿行。抓住所有线程,与Simd伸出手,或拉任何其他技巧,并创建最快的实现来解决此任务!

文本文件包含一系列气象站的温度值。每一行都是格式的一个测量<string: station name>;<double: measurement> ,其测量值完全具有一个分数数字。行被等于LF(ASCII 10)的单线进料分开,以与原始挑战一致,而不是CR+LF(ASCII 13+10)。以下显示了十行作为一个例子:
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
The task is to write an Object Pascal program which reads the file, calculates the min, mean, and max temperature value per weather station, and emits the results on STDOUT like this (ie, sorted alphabetically by station name, and the result values per station in the format <min>/<mean>/<max> , rounded to one fractional digit, with the decimal separator being a period . , and for that you can chose one of the options presented in the舍入或实施与所提供的选项一致的。):
{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, ...}
提交将通过该存储库的PR (拉请请求)。
挑战将从3月10日至2024年5月10日。
创建您的条目时,请执行以下操作:
entries下使用您的第一个初始名称和姓氏(例如Gustavo Carreno: entries/gcarreno创建一个文件夹。README.md ,其中包含有关您的方法,例如entries/gcarreno/README.md内容。entries/<your name>/src下,例如entries/gcarreno/src 。bin文件夹。.gitignore 。这一挑战主要是为了让我们学习一些新的东西。这意味着在以下条件下,将允许复制他人的代码:
API或外部C/C++库。Jedi Project甚至mORMmot (或其他任何内容)(如果它编译)都可以运行允许的跨平台。IDE的默认格式工具进行格式。重要的
即使您只能访问Rad Studio的社区版,也可以输入此挑战。我有一个Windows VM,安装了RAD录音室,它将在我的Linux主机中进行必要的交叉汇编。
提交您的实施并成为排行榜的一部分!
在这个宏伟的社区的帮助下,我们最终能够找到一个有效的圆形解决方案。
这意味着我鼓励每个人使用现在的基线中的代码。
我确实必须清楚地表明,使用该代码是一种选择,您总是可以选择退出。
但是,如果您确实选择进去,只需在您的条目中加入该单元,就完成了工作。
笔记
现在,我们拥有32B和64B的发电机的Lazarus版本和Delphi版本。
为了产生十亿行文本,我们正在为官方发电机提供源代码,因此我们都有相同的输入数据。
| 范围 | 描述 |
|---|---|
| -h或- 螺旋 | 写下此帮助消息并退出 |
| -v或- version | 写版本并退出 |
| -i或- 输入文件<文件名> | 包含气象站的文件 |
| -o或- 输出文件<文件名> | 将包含生成行的文件 |
| -n或-line-count <数字> | 要生成的行量(可以使用1_000_000_000) |
| -4或-400站 | 输出文件中只有400个气象站 |
笔记
这仍然有点不断变化,仍然需要完成Delphi版本。
为了验证官方输出,我们正在为官方基准提供源代码。
| 范围 | 描述 |
|---|---|
| -h或- 螺旋 | 写下此帮助消息并退出 |
| -v或- version | 写版本并退出 |
| -i或- 输入文件<文件名> | 包含10亿行的文件 |
您可以使用SHA256实用程序来验证生成的measurements.txt :
Linux
$ sha256sum ./data/measurements.txtWindows(命令行)
C:> CertUtil -hashfile .datameasurements.txt SHA256Windows(PowerShell)
Get-FileHash . data measurements.txt - Algorithm SHA256预期SHA256哈希: 2b48bc2fa0b82d748925a820f43f75df01cc06df7447c7571e52d3962e675960
现在有一个基线的Delphi版本。这意味着我们现在有一种正式的方式来在栅栏的两侧产生有效的输出。
因此,我们现在拥有官方哈希: 4256d19d3e134d79cc6f160d428a1d859ce961167bd01ca528daca8705163910
还有一个基线输出的存档版本
为了更轻松地与基线进行比较,这里是不同生成行计数的哈希:
| 线 | 输入文件哈希 | 输出文件哈希 |
|---|---|---|
| 1_000 | 0be4844a2417c08a85a44b26509bbe6868a6f65d0e0d087d3f9ceedc02f5ceaa | d42c37ca405f230e91dd0a75e6741dbbbcddd2338963ea0f0e727cf90ecbd7e7 |
| 10_000 | 447380628ca25b1c9901c2e62e01591f2e2f794d2888934a5e9d4a67d72346a5 | b4dd36d80a63fefdccbff50ffaaef7e2092034935c729b3330569c7c7f7351fc |
| 100_000 | dd3a4821e91de82e44f17f65b1951af8a21652b92c20a7e53a1fa02ea6e5fbd2 | c9e50d46bba327727bf4b412ec0401e0c2e59c9035b94b288e15631ca621cb52 |
| 1_000_000 | c2955973c3db29bf544655c11d2d3c7ac902c9f65014026b210bd25eb1876c0c | 5fedbd9811660ee3423f979a0c854ec8b70da3e804170bc39bcc400c94f93bc0 |
| 10_000_000 | 90193d314e991f7789258c8b6b06c493a4d624991e203b12343c2a8ce1d0c7fd | 2f3a6383b3bc83a9ad53fc0773de2da57bd4add8a51662cdb86bfca502d276a3 |
| 100_000_000 | f55384da4646a0c77a1d5dd94a58f8430c5956fe180cedcb17b4425fe5389a39 | 7e8339b5d268fa400a93887b7a1140ac1adf683a8e837e6274fd71e383c26c6b |
我认为我希望这一挑战能够转为11!
这意味着与原件有一些差异。
原始结果是在较小的气象站上计算的:400。
虽然我还没有列举在输入文件上居住多少个,但由于我们使用data/weather_stations.csv上存在的完整〜40K站点来生成输入文件,因此我们不会将其限制为任何数字。
另一个区别是这些机器已运行。
我正在使用自己的计算机,其中包括结果部分bellow中提到的规格。
我还允许使用我的计算机提供的完整32个线程,而原始挑战将其限制在8。
最初的挑战还具有第二个结果表,其中包括10K站,并使用所有64个线程。
就这么说,应与最初的挑战进行比较。
这些是将所有条目纳入我的个人计算机上的挑战的结果:
| # | 结果(M:S.MS) | 编译器 | 提交者 | 笔记 | 证书 |
|---|---|---|---|---|---|
| 1 | 0:1.261 | Lazarus-3.99,FPC-3.3.1 | Arnaud Bouchez | 使用mORMot2个线程 | |
| 2 | 0:1.950 | Lazarus-3.99,FPC-3.3.1 | o coddo | 使用SCL ,32个线程 | |
| 3 | 0:2.101 | Lazarus-3.99,FPC-3.3.1 | 乔治·哈特姆 | 使用mORMot2个线程 | |
| 4 | 0:5.248 | Lazarus-3.99,FPC-3.3.1 | Hartmut Grosser | 使用32个线程 | |
| 5 | 0:7.363 | Lazarus-3.99,FPC-3.3.1 | 贝尼托·范德·赞德 | 使用32个线程 | |
| 6 | 0:9.627 | Lazarus-3.99,FPC-3.3.1 | G克拉克 | 使用32个线程 | |
| 7 | 0:13.321 | Lazarus-3.99,FPC-3.3.1 | SzékelyBalázs | 使用32个线程 | |
| 8 | 0:18.062 | Lazarus-3.99,FPC-3.3.1 | Lurendrejer Aksen | 使用32个线程 | |
| 9 | 1:9.354 | Lazarus-3.99,FPC-3.3.1 | 理查德·劳森(Richard Lawson) | 使用1个线程 | |
| 10 | 2:24.787 | Lazarus-3.99,FPC-3.3.1 | Iwan Kelaiah | 使用1个线程 | |
| 11 | 6:2.343 | Delphi 12.1 | 布莱恩火 | 使用8个线程 | |
| 12 | 6:53.788 | Delphi 12.1 | 大卫·科尼利厄斯(David Cornelius) | 使用1个线程 | |
| 13 | 8:37.975 | Delphi 12.1 | 丹尼尔·托普夫(DanielTöpfl) | 使用1个线程 |
笔记
经过@Paweld进行了一些测试后,进行
HDD运行是没有意义的。我从结果中删除了
每个竞争者在SSD和HDD中使用hyperfine连续运行10次。
10运行的平均值是该竞争者的结果,并将添加到上面的结果表中。
最小值和最大值被丢弃,然后使用其余8个值来计算平均值。
完全相同的measurements.txt文件用于评估所有竞争者。
这仅是为了吹牛权利和这种挑战的乐趣。
问:我可以从其他提交中复制代码吗?
答:是的,你可以。挑战的主要重点是学习新事物,而不是“获胜”。当您这样做时,请归功于相关的来源提交。请不要重新提交其他条目,而没有琐碎的改进。
问:测量文件的编码是什么?
答:该文件用UTF-8编码。
问:哪种操作系统用于评估?
答:Ubuntu 23.10 64b。
我要感谢@Paweld将我们从我痛苦的200M尝试中带到了大约25秒钟,击败了Python脚本大约4分半钟。
我要感谢@mobius花时间提供发电机的Delphi版本。
我要感谢@DTPFL在最新的所有内容中保持最新的README.md文件的宝贵工作。
我要感谢SzékelyBalázs提供了许多补丁,使一切都符合原始挑战。
我要感谢@corneliusdavid给出了一次一次信息文件,并使事情变得更加清晰和清晰。
我要感谢Pack Man先生(又名O)清除了围绕四舍五入的雾气。
我要感谢Georges为我们提供了Delphi版本的基线。
原始存储库:https://github.com/gunnarmorling/1brc
我通过观看此视频的尝试来找到有关:
有问题的博客文章:https://www.bytesizego.com/blog/one-billion-row--challenge-go
此代码基础可根据MIT许可证获得。
彼此好!
除了获胜之外,这一挑战的目的是获得乐趣并学习新知识。