هذا هو المستودع الذي سيقوم بتنسيق تحدي صف 1 مليار لصالح الكائن Pascal.
إن تحدي صف واحد للمليار (1BRC) هو استكشاف ممتع لمدى دفع الكائن الحديث باسكال لتجميع مليار صف من ملف نصي. احصل على جميع خيوطك ، أو تواصل مع 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
تتمثل المهمة في كتابة برنامج كائن Pascal الذي يقرأ الملف ، ويحسب قيمة درجة الحرارة MIN ، والمتوسط ، ودرجة الحد الأقصى لكل محطة للطقس ، وينتهي النتائج على 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, ...}
سيتم تقديم الطلبات عبر PR (طلب سحب) إلى هذا المستودع.
سيستمر التحدي من 10 مارس وحتى 10 مايو 2024.
عند إنشاء إدخالك ، يرجى القيام بما يلي:
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 Studio ، من شأنه أن يقوم بالتجميع المتقاطع اللازم في مضيف Linux الخاص بي.
أرسل تطبيقك وتصبح جزءًا من مجلس Leader!
بمساعدة هذا المجتمع الرائع ، تمكنا أخيرًا من الوصول إلى حل تقريب يعمل.
هذا يعني أنني أشجع الجميع على استخدام الكود الموجود الآن في وحدة Baseline.common.
لا بد لي من توضيح البلورة أن استخدام هذا الرمز هو خيار ، يمكنك دائمًا إلغاء الاشتراك منه.
ولكن إذا اخترت ذلك ، فقط قم بتضمين تلك الوحدة في إدخالك ووظائفك.
ملحوظة
لدينا الآن كل من إصدار Lazarus وإصدار Delphi من المولد لكل من 32B و 64B.
من أجل إنتاج صفة نصية مليار من النص ، نقدم الكود المصدري للمولد الرسمي ، لذلك لدينا جميعًا نفس بيانات الإدخال.
| المعلمة | وصف |
|---|---|
| -H أو -help | يكتب رسالة المساعدة هذه وتخرج |
| -v أو - | يكتب النسخة والخروج |
| -i أو -ترفع المدخلات <fileName> | الملف الذي يحتوي على محطات الطقس |
| -O أو -ملف الإخراج <fileName> | الملف الذي سيحتوي على الخطوط التي تم إنشاؤها |
| -n أو- line-count <morm> | كمية الخطوط المراد إنشاؤها (يمكن استخدام 1_000_000_000) |
| -4 أو -400stations | فقط 400 محطة طقس في ملف الإخراج |
ملحوظة
لا يزال هذا قليلاً في التدفق ، ولا يزال بحاجة إلى إنجاز إصدار Delphi.
من أجل التحقق من الإخراج الرسمي ، نقدم الرمز المصدري لخط الأساس الرسمي.
| المعلمة | وصف |
|---|---|
| -H أو -help | يكتب رسالة المساعدة هذه وتخرج |
| -v أو - | يكتب النسخة والخروج |
| -i أو -ترفع المدخلات <fileName> | الملف الذي يحتوي على 1 مليار صف |
يمكنك التحقق من measurements.txt التي تم إنشاؤها. txt مع أداة SHA256 :
Linux
$ sha256sum ./data/measurements.txtWindows (سطر الأوامر)
C:> CertUtil -hashfile .datameasurements.txt SHA256Windows (PowerShell)
Get-FileHash . data measurements.txt - Algorithm SHA256 متوقع SHA256 hash: 2b48bc2fa0b82d748925a820f43f75df01cc06df7447c7571e52d3962e675960
يوجد الآن نسخة دلفي من خط الأساس. هذا يعني أن لدينا الآن طريقة رسمية لتوليد ناتج صالح على جانبي السياج.
مع هذا ، لدينا الآن التجزئة الرسمية: 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.
على الرغم من أنني لم أقابل عدد الإقامة في ملف الإدخال ، فإننا لا نقصره بأي رقم حيث نستخدم محطات ~ 40k الكاملة الموجودة على data/weather_stations.csv لإنشاء ملف الإدخال.
فرق آخر هو الآلات التي يتم تشغيلها.
أنا أستخدم الجهاز الخاص بي ، مع المواصفات المذكورة في قسم النتائج.
أسمح أيضًا باستخدام 32 مؤشرات الترابط الكاملة التي يوفرها الجهاز الخاص بي ، حيث يحدها التحدي الأصلي إلى 8.
يحتوي التحدي الأصلي أيضًا على جدول نتائج ثانٍ مع محطات 10K واستخدام جميع المواضيع الـ 64.
مع كل هذا قيل ، ينبغي إجراء مقارنة مع التحدي الأصلي مع وضع ذلك في الاعتبار.
هذه هي النتائج من تشغيل جميع الإدخالات إلى التحدي على جهاز الكمبيوتر الشخصي الخاص بي:
| # | النتيجة (M: S.MS) | المترجم | مقدم | ملحوظات | الشهادات |
|---|---|---|---|---|---|
| 1 | 0: 1.261 | Lazarus-3.99 ، FPC-3.3.1 | أرنود بوش | باستخدام mORMot2 ، 32 موضوع | |
| 2 | 0: 1.950 | Lazarus-3.99 ، FPC-3.3.1 | يا كودو | باستخدام SCL ، 32 موضوع | |
| 3 | 0: 2.101 | Lazarus-3.99 ، FPC-3.3.1 | جورج هاتم | باستخدام mORMot2 ، 32 موضوع | |
| 4 | 0: 5.248 | Lazarus-3.99 ، FPC-3.3.1 | هارتموت جروسر | باستخدام 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 Klark | باستخدام 32 موضوع | |
| 7 | 0: 13.321 | Lazarus-3.99 ، FPC-3.3.1 | Székely Balá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 | ريتشارد لوسون | باستخدام موضوع واحد | |
| 10 | 2: 24.787 | Lazarus-3.99 ، FPC-3.3.1 | إيوان كيليا | باستخدام موضوع واحد | |
| 11 | 6: 2.343 | دلفي 12.1 | براين فاير | باستخدام 8 موضوعات | |
| 12 | 6: 53.788 | دلفي 12.1 | ديفيد كورنيليوس | باستخدام موضوع واحد | |
| 13 | 8: 37.975 | دلفي 12.1 | دانيال توبل | باستخدام موضوع واحد |
ملحوظة
بعد بعض الاختبارات التي أجراها paweld ، لا معنى له أن يكون لديك تشغيل
HDD. لقد أزلت ذلك من النتائج
يتم تشغيل كل منافس 10 مرات على التوالي لكل من SSD و HDD باستخدام hyperfine للوقت الذي يستغرقه.
القيمة المتوسطة للتشغيل العشرة هي النتيجة لهذا المنافس وسيتم إضافتها إلى جدول النتائج أعلاه.
يتم التخلص من قيم Min و Max ثم يتم استخدام القيم الثمانية المتبقية لحساب المتوسط.
يتم استخدام ملف measurements.txt نفسه بالضبط لتقييم جميع المتنافسين.
يتم تشغيل هذا من أجل حقوق المفاخرة فقط ومتعة مثل هذا التحدي.
س: هل يمكنني نسخ الرمز من الطلبات الأخرى؟
ج: نعم ، يمكنك. التركيز الأساسي للتحدي هو تعلم شيء جديد ، بدلاً من "الفوز". عندما تفعل ذلك ، يرجى إعطاء الائتمان لتقديمات المصدر ذات الصلة. من فضلك لا تعيد تقديم إدخالات أخرى بدون تحسينات تافهة أو فقط.
س: ما هو ترميز ملف القياسات.
ج: يتم ترميز الملف باستخدام UTF-8.
س: ما هو نظام التشغيل المستخدم للتقييم؟
A: Ubuntu 23.10 64b.
أود أن أشكر paweld على أخذنا من محاولتي البائسة البائسة التي تبلغ مساحتها 20 مترًا ، إلى 25 عامًا ، متغلبًا على نص Python بنحو 4 دقائق ونصف.
أود أن أشكر Mobius على الوقت لتوفير إصدار Delphi من المولد.
أود أن أشكر DTPFL على عمله الذي لا يقدر بثمن في الحفاظ على ملف README.md حتى الآن مع كل شيء.
أود أن أشكر Székely Balázs على توفير العديد من التصحيحات لجعل كل شيء متوافقًا مع التحدي الأصلي.
أود أن أشكر CorneliusDavid على إعطاء بعض المعلومات ملفات مرة واحدة وجعل الأمور أكثر وضوحًا وواضحة.
أود أن أشكر السيد Pack Man ، المعروف أيضًا باسم O ، على تطهير الضباب حول قضايا التقريب.
أود أن أشكر جورج على تزويدنا بإصدار دلفي من خط الأساس.
المستودع الأصلي: https://github.com/gunnarmorling/1brc
اكتشفت ذلك من خلال مشاهدة هذا الفيديو حول محاولة في Go: https://www.youtube.com/watch؟v=cyng524s-ma
منشور المدونة في السؤال: https://www.bytesizego.com/blog/one-billion-row-challenge-go
قاعدة الرمز هذه متوفرة تحت رخصة معهد ماساتشوستس للتكنولوجيا.
كن ممتازا لبعضنا البعض!
أكثر من الفوز ، الغرض من هذا التحدي هو الاستمتاع وتعلم شيء جديد.