這是一個存儲庫,它將協調對象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許可證獲得。
彼此好!
除了獲勝之外,這一挑戰的目的是獲得樂趣並學習新知識。