Ini adalah repositori yang akan mengoordinasikan tantangan 1 miliar baris untuk objek Pascal.
Tantangan satu miliar baris (1BRC) adalah eksplorasi yang menyenangkan tentang seberapa jauh objek modern Pascal dapat didorong untuk menggabungkan satu miliar baris dari file teks. Raih semua utas Anda, menjangkau SIMD, atau tarik trik lainnya, dan buat implementasi tercepat untuk menyelesaikan tugas ini!

File teks berisi nilai suhu untuk berbagai stasiun cuaca. Setiap baris adalah salah satu pengukuran dalam format <string: station name>;<double: measurement> , dengan nilai pengukuran memiliki tepat satu digit fraksional. Baris dipisahkan oleh umpan baris tunggal yang sama dengan LF (ASCII 10) untuk konsistensi dengan tantangan asli - dan bukan Cr+LF (ASCII 13+10) lagi. Berikut ini menunjukkan sepuluh baris sebagai contoh:
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
Tugasnya adalah untuk menulis program Pascal objek yang membaca file, menghitung nilai min, rata -rata, dan nilai suhu maksimum per stasiun cuaca, dan memancarkan hasil pada STDOUT seperti ini ( <min>/<mean>/<max> , diurutkan secara abjad dengan nama stasiun, dan nilai hasil per stasiun dalam format yang ada di satu -satunya yang dapat dipisahkan . Bagian atau terapkan sendiri yang konsisten dengan opsi yang disediakan.):
{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, ...}
Pengajuan akan melalui PR (permintaan tarik) ke repositori ini.
Tantangan akan berlangsung dari 10 Maret hingga 10 Mei 2024.
Saat membuat entri Anda, silakan lakukan sebagai berikut:
entries dengan nama awal dan belakang pertama Anda, misalnya, untuk Gustavo Carreno: entries/gcarreno .README.md dengan beberapa konten tentang pendekatan Anda, misalnya, entries/gcarreno/README.md .entries/<your name>/src , misalnya, entries/gcarreno/src .bin dari akar repositori ini..gitignore khusus untuk sesuatu yang tidak ada di yang utama, silakan lakukan.Tantangan ini terutama untuk memungkinkan kita mempelajari sesuatu yang baru. Ini berarti bahwa menyalin kode dari orang lain akan diizinkan, dalam kondisi ini:
API sistem operasi atau perpustakaan eksternal C/C++ .Jedi Project atau bahkan mORMmot (atau apa pun), jika dikompilasi, berjalan lintas platform diizinkan.IDE . PENTING
Tantangan ini dapat dimasukkan bahkan jika Anda hanya memiliki akses ke edisi komunitas RAD Studio. Saya memiliki Windows VM, dengan Rad Studio terpasang, yang akan melakukan kompilasi silang yang diperlukan ke host Linux saya.
Kirimkan implementasi Anda dan menjadi bagian dari Dewan Pemimpin!
Dengan bantuan komunitas yang luar biasa ini, kami akhirnya dapat mencapai solusi pembulatan yang berhasil.
Ini berarti bahwa saya mendorong semua orang untuk menggunakan kode yang sekarang ada di unit baseline.
Saya harus membuat kristal jelas bahwa menggunakan kode itu adalah opsi , yang selalu dapat Anda pilih.
Tetapi jika Anda memilih, sertakan unit itu di entri Anda dan pekerjaan sudah selesai.
CATATAN
Kami sekarang memiliki versi Lazarus dan versi generator Delphi untuk 32B dan 64B.
Untuk menghasilkan satu miliar baris teks, kami menyediakan kode sumber untuk generator resmi, jadi kami semua memiliki data masuk yang sama.
| Parameter | Keterangan |
|---|---|
| -h atau --help | Menulis pesan bantuan ini dan keluar |
| -v atau --version | Menulis versi dan keluar |
| -i atau -input-file <filename> | File yang berisi stasiun cuaca |
| -o atau -output-file <filename> | File yang akan berisi baris yang dihasilkan |
| -n atau --Line-count <number> | Jumlah baris yang akan dihasilkan (dapat menggunakan 1_000_000_000) |
| -4 atau --400Station | Hanya 400 stasiun cuaca di file output |
CATATAN
Ini masih sedikit berubah, masih perlu menyelesaikan versi Delphi.
Untuk memverifikasi output resmi, kami menyediakan kode sumber untuk baseline resmi.
| Parameter | Keterangan |
|---|---|
| -h atau --help | Menulis pesan bantuan ini dan keluar |
| -v atau --version | Menulis versi dan keluar |
| -i atau -input-file <filename> | File yang berisi 1 miliar baris |
Anda dapat memverifikasi measurements.txt yang dihasilkan.txt dengan utilitas SHA256 :
Linux
$ sha256sum ./data/measurements.txtWindows (baris perintah)
C:> CertUtil -hashfile .datameasurements.txt SHA256Windows (PowerShell)
Get-FileHash . data measurements.txt - Algorithm SHA256 SHA256 Hash yang Diharapkan: 2b48bc2fa0b82d748925a820f43f75df01cc06df7447c7571e52d3962e675960
Sekarang ada versi Delphi dari garis dasar. Ini berarti bahwa kita sekarang memiliki cara resmi untuk menghasilkan output yang valid di kedua sisi pagar.
Dengan ini, kami sekarang memiliki hash resmi: 4256d19d3e134d79cc6f160d428a1d859ce961167bd01ca528daca8705163910
Ada juga versi yang diarsipkan dari output dasar
Untuk perbandingan yang lebih mudah dengan baseline, berikut adalah hash untuk jumlah baris yang dihasilkan berbeda:
| Baris | Hash file input | Hash file output |
|---|---|---|
| 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 |
Saya telah memutuskan bahwa saya ingin tantangan ini dibalik hingga 11!
Ini berarti ada beberapa perbedaan dari yang asli.
Hasil asli dihitung pada set stasiun cuaca yang lebih kecil: 400.
Meskipun saya belum menabulasi berapa banyak yang tinggal di file input, kami tidak membatasi ke nomor apa pun karena kami menggunakan stasiun ~ 40k penuh yang ada di data/weather_stations.csv untuk menghasilkan file input.
Perbedaan lainnya adalah mesin ini dijalankan.
Saya menggunakan mesin saya sendiri, dengan spesifikasi yang disebutkan di bagian hasil di bawahnya.
Saya juga mengizinkan penggunaan 32 utas penuh yang disediakan mesin saya, di mana tantangan asli membatasi hingga 8.
Tantangan asli juga memiliki tabel hasil kedua dengan stasiun 10K dan penggunaan semua 64 utas.
Dengan semua yang dikatakan ini, perbandingan dengan tantangan asli harus dilakukan dengan mengingat hal ini.
Ini adalah hasil dari menjalankan semua entri ke dalam tantangan di komputer pribadi saya:
| # | Hasil (m: s.ms) | Penyusun | Pengirim | Catatan | Sertifikat |
|---|---|---|---|---|---|
| 1 | 0: 1.261 | Lazarus-3.99, FPC-3.3.1 | Arnaud Bouchez | Menggunakan mORMot2 , 32 Thread | |
| 2 | 0: 1.950 | Lazarus-3.99, FPC-3.3.1 | O coddo | Menggunakan SCL , 32 utas | |
| 3 | 0: 2.101 | Lazarus-3.99, FPC-3.3.1 | Georges Hatem | Menggunakan mORMot2 , 32 Thread | |
| 4 | 0: 5.248 | Lazarus-3.99, FPC-3.3.1 | Hartmut Grosser | Menggunakan 32 utas | |
| 5 | 0: 7.363 | Lazarus-3.99, FPC-3.3.1 | Benito van der Zander | Menggunakan 32 utas | |
| 6 | 0: 9.627 | Lazarus-3.99, FPC-3.3.1 | G Klark | Menggunakan 32 utas | |
| 7 | 0: 13.321 | Lazarus-3.99, FPC-3.3.1 | Székely Balázs | Menggunakan 32 utas | |
| 8 | 0: 18.062 | Lazarus-3.99, FPC-3.3.1 | Lurendrejer Aksen | Menggunakan 32 utas | |
| 9 | 1: 9.354 | Lazarus-3.99, FPC-3.3.1 | Richard Lawson | Menggunakan 1 utas | |
| 10 | 2: 24.787 | Lazarus-3.99, FPC-3.3.1 | Iwan Kelaah | Menggunakan 1 utas | |
| 11 | 6: 2.343 | Delphi 12.1 | Brian Fire | Menggunakan 8 utas | |
| 12 | 6: 53.788 | Delphi 12.1 | David Cornelius | Menggunakan 1 utas | |
| 13 | 8: 37.975 | Delphi 12.1 | Daniel Töpfl | Menggunakan 1 utas |
CATATAN
Setelah beberapa tes yang dilakukan oleh @Paweld, tidak masuk akal untuk menjalankan
HDD. Saya telah menghapusnya dari hasilnya
Setiap pesaing dijalankan 10 kali berturut -turut untuk SSD dan HDD menggunakan hyperfine untuk waktu yang diambil.
Nilai rata -rata dari 10 berjalan adalah hasil untuk pesaing itu dan akan ditambahkan ke tabel hasil di atas.
Nilai min dan maks dibuang dan 8 nilai yang tersisa kemudian digunakan untuk menghitung rata -rata.
File measurements.txt yang sama persis digunakan untuk mengevaluasi semua pesaing.
Ini dijalankan hanya untuk hak -hak menyombongkan diri dan kesenangan dari tantangan semacam itu.
T: Dapatkah saya menyalin kode dari pengiriman lain?
A: Ya, Anda bisa. Fokus utama dari tantangan ini adalah tentang mempelajari sesuatu yang baru, bukan "menang". Saat Anda melakukannya, harap berikan kredit untuk pengiriman sumber yang relevan. Tolong jangan kembali ke entri lain tanpa atau hanya perbaikan sepele.
T: Apa pengkodean file pengukuran.txt?
A: File ini dikodekan dengan UTF-8.
T: Sistem operasi mana yang digunakan untuk evaluasi?
A: Ubuntu 23.10 64b.
Saya ingin mengucapkan terima kasih @Paweld karena telah membawa kami dari upaya 20m saya yang menyedihkan, hingga ~ 25 -an, mengalahkan skrip Python sekitar 4 setengah menit.
Saya ingin mengucapkan terima kasih @Mobius karena meluangkan waktu untuk memberikan versi generator Delphi.
Saya ingin mengucapkan terima kasih @DTPFL atas karyanya yang tak ternilai untuk mempertahankan file README.md up to date dengan semuanya.
Saya ingin mengucapkan terima kasih kepada Székely Balázs karena menyediakan banyak tambalan untuk membuat semuanya sesuai dengan tantangan aslinya.
Saya ingin mengucapkan terima kasih kepada @CorneliusDavid karena telah memberikan beberapa file informasi sekali dan membuat segalanya lebih terbaca dan jelas.
Saya ingin berterima kasih kepada Mr. Pack Man, alias O, karena telah membersihkan kabut di sekitar masalah pembulatan.
Saya ingin mengucapkan terima kasih kepada Georges karena memberi kami versi baseline Delphi.
Repositori asli: https://github.com/gunnarmorling/1brc
Saya mengetahuinya dengan menonton video ini tentang upaya di Go: https://www.youtube.com/watch?v=cyng524s-ma
Posting blog yang dimaksud: https://www.bytesizego.com/blog/one-billion-row-challenge-go
Basis kode ini tersedia di bawah lisensi MIT.
Bersikaplah sangat baik satu sama lain!
Lebih dari menang, tujuan dari tantangan ini adalah untuk bersenang -senang dan mempelajari sesuatu yang baru.