سباق اللغات البرمجية لمناولة النصوص الضخمة.. من يكسب؟ما هي اللغات البرمجية الأكثر قدرة على التعامل مع الملفات النصية الكبيرة؟ وماهي أكثرهم سرعة في ذلك؟ قمت بإعداد مجموعة من البرامج المتطابقة بعدة لغات برمجية، كلّ برنامج يقوم بانتاج نصّ من خلال مراكمة بنائه بتكرار محدد، حيث يقوم في كل تكرار بإضافة جزء للنص الأصلي، بعدها يقوم البرنامج بحفظ هذا النصّ دفعة واحدة في ملف. سنقوم بتشغيل هذه البرامج على عدة جولات ؛ كل جولة تستهدف توليد نص أكبر حجما من الجولة التي قبلها. التفاصيل الفنية تركتها في آخر المقال للمهتمين. أو في منصة GitHub حيث وضعت الكود المصدري للغات المشاركة في السباق. اللغات المستهدفة عددها 18 لغة وهي: Rust, Go, C, C++, Free Pascal, C#, F#, Java, Python, OCaml, Dart, D, Nim, V, Julia, Red, Crystal, Perl. بعض الملاحظات السريعة قبل بدء السباق:
السباق:الآن لنرى ما الذي تستطيعه كلّ لغة. الجولة الأولى:تستهدف الجولة الأولى بناء كتلة نصية بحجم 513 ميقا بايت، من خلال تكرارات عددها 50 مليون تكرار فكانت نتيجة سرعة الأداء كالتالي: 50,000,000 - 513 MB
الثلاثة الأكثر سرعة هم بالترتيب Rust ثم Crystal ثم جافا بسرعات متساوية تقريبا. كنت أتوقع C و C++ أن تكونا في المقدمة، بسبب شهرتهما بالسرعة بين اللغات و وأنهما عادة الأساس لمقارنة أداء اللغات الأخرى. كذلك لم أتوقّع أن تكون جافا بهذه السرعة مقارنة ب C#. نلاحظ أيظا أن F# أبطأ قليلا من C# برغم أنها تعملان في نفس البيئة .Net أحد أسباب ذلك أن F# يتم تحويلها أولا إلى C# قبل ترجمتها ل Byte code . لغة Crystal جاءت الثانية بعد Rust لم أكن أتوقّع ذلك، كذلك الأمر بالنسبة للغة Perl التي تفوّقت على C و C++. نتيجة لغة Go تبدو جيدة (أقل من أربع ثواني)، المفاجأة الكبيرة كانت لغة Python التي استطاعت أن تسبق لغات مثل Free Pascal. لغة Red جاءت الأخيرة للأسف مسجلة 17 ثانية أي ضعف اللغة التي قبلها في الترتيب ، أقول لللأسف لأنها لغة أحبها وأحب فلسفتها وصيغتها النحوية وأصحابها يسوقون للهجة منها للتعامل مع تقنيات BlockChain. الجولة الثانيةتستهدف بناء كتلة نصية بحجم 1 قيقا بايت، من خلال تكرارات عددها 100 مليون تكرار فكانت نتيجة الأداء كالتالي: 100,000,000 - 1.01 GB
لنرى أولا من خرج من السباق. لغتان هما Red و F# . كما رأينا في الجولة السابقة لغة Red جاءت الأخيرة وبفارق كبير مع ما قبلها ، أما لغة F# فمن المحزن خروجها مبكرا، وهذا يدفعنا للتساؤل : هل ستقاوم أختها C# في الجولات القادمة؟ لغة Rust كانت في المقدمة تليها كريستال ثم Java بعدها لغة C# بضعف سرعة جافا ، نلاحظ أن جافا و C# فشلتا في حفظ النص في ملف. أي نجحتا في إعداد الكتلة النصية المطلوبة في الذاكرة و لم تتمكنا من حفظها في ملف نصّي. لغة Crystal أداؤها ممتاز وهي من اللغات التي تهدف لتكون بديلا عن لغة C/C++ ، واستلهمت لغة Ruby لتكون لغة أنيقة وموجزة ومعبّرة. لغة Nim مازالت تحتفظ بأسبقيتها على لغة C. في الواقع لغة Nim يقوم محوّلها بتحويلها إلى لغة C أولا ثم باختيار أحد تنفيذات C يتم ترجمتها لملف تنفيذي، لذلك لا نستغرب سرعة الأداء لديها. برنامج Python كان سريعا في هذه الجولة أيضا. كانت لغة V بطيئة (13 ثانية) عكس الدعاية التي تحاط بها من قبل القائمين عليها لتكون بديلا للغة C، هذا الأداء المخيّب للآمال يطرح شكوكا حول امكانيات أدائها واستمراها في هذا السباق. أيضا لغة Dart قدمت أدءًا عاديا، هذه اللغة من شركة قوقل وهي اللغة الرسمية لإطار Flutter المنتشر بقوة للتطوير المتعدد المنصّات خاصة لتطبيقات الهواتف . الجولة الثالثة:تمت مضاعفة حجم الكتلة النصية المطلوب إنشاؤها ل 2 قيقا بزيادة عدد التكرارات إلى 200 مليون تكرار. وهذه النتائج: 200,000,000 - 2.13 GB
خرجت جافا من السباق، وكما كان متوقعا بعد خروج F#؛ خرجت أختها لغة C# ، وخرجت معهم Free Pascal و Crystal و لغة V. لغات جافا و F# و C# و Crystal قدمت أداءًا متفوقا لكن ليس مع الأحجام الكبيرة من البيانات. المتصدر لسباق السرعة هي Rust، ثم - وبفارق كبير - لفات Cو Nim و Perl بأداء متقارب ثم C++. إلا أن C++ و Nim الوحيدتان اللتان فشلتا في حفظ الكتلة النصية في ملف. لازالت لغة Python متقدمة وتسبق لغات يفترض أنها سريعة مثل D و Go آخر القائمة كانت لغة OCaml وهي اللغة الأم للغة F# (لغة F# هي تنفيذ للغة OCaml على بيئة .Net) قبلها كانت لغة Julia . لغة Julia ظهرت 2012 وهي لغة تستهدف التحليلات الاحصائية والرقمية والمسائل العلمية والاحصائيات ولتكون خلفا للغة R يتم تشغيلها بمفسّر interpreter مثل لغة Python و Perl. الجولة الرابعة:في هذه الجولة الكتلة النصية يمكن أن نقول عنها فعلا انها ضخمة حيث تبلغ حوالي 6 قيقا بايت يتم صنعها ب 500 مليون تكرار: 500,000,000 - 5.48 GB
في هذه الجولة لم يخرج أحد من السباق،Rust في رأس القائمة تليها بفارق كبير C++ ، لكن لغة C لم تتمكن من حفظ الملف النصي في هذه الجولة. لازالت Perl و Python تبهرانا بسرعتهما متقدمة على لغات يفترض أنها محسوبة على اللغات السريعة مثل Julia و D. لكن نكرر أن الاختبارات الحقيقية لأداء اللغات تستند على عدة محاور ولا يتم الحكم على أداء لغة ما من جانب واحد فط. لغة Dart سجّلت 3.5 دقيقية فكانت بطيئة مقارنة بسرعة لغة Rust التي كانت 8 ثواني،، لكن بالمقابل لغة Dart أنجزت كامل المهمة بنجاح بحفظها للملف في الوقت الذي فشلت فيه لغات C و C++ وNim. الجولة الخامسة:تمت مضاعقة حجم لكتلة النصية لتصبح 11 قيقا بايت وبعدد تكرارات ألف مليون تكرار. في هذه الجولة لم يخرج أحد من السباق،Rust في رأس القائمة تليها بفارق كبير C++ . لازالت Perl و Python تبهرانا بسرعتهما متقدمتان على لغات يفترض أنها محسوبة على اللغات السريعة مثل Julia و D. لكن نكرر أن الاختبارات الحقيقية لأداء اللغات تستند على عدة محاور ولا يتم الحكم على أداء لغة ما من جانب واحد فط. لغة Dart سجّلت 3.5 دقيقية فكانت بطيئة مقارنة بسرعة لغة Rust التي كانت 8 ثواني،، لكن بالمقابل لغة Dart أنجزت كامل المهمة بنجاح بحفظها للملف في الوقت الذي فشلت فيه لغات C و C++ وNim. الجولة الخامسة:تمت مضاعقة حجم لكتلة النصية لتصبح 11 قيقا بايت وبعدد تكرارات ألف مليون تكرار. 1000,000,000 - 11.0 GB
في هذه الجولة خرجت اللغات D وOCaml و Dart، ولا فرق تقريبا في ترتيب سرعة اللغات. D من اللغات الجميلة والداعمة لعدة مذاهب برمجية Paradigms ، أما لغةOCaml فهي من عائلة ML مثل Haskel و F# وهي أولى محاولات نقل اللغات الدالية Functional من الوسط الأكاديمي إلى الوسط الصناعي ، وأتبثت فعاليتها في التطبيقات العلمية والمالية. الجولة السادسة:هذه جولة الكبار الذين أثبتوا أنهم لغات المهام الصعبة. نذكّر بأن الهدف من هذا التسابق هو معرفة قدرة كل لغة على توليد كتلة نصية ضخمة وسرعتها في ذلك، ثم حفظها في ملف. أيضا نذكّر بأن عدم القدرة على حفظ الملف النصي دفعة واحدة ليس مهما؛ إذ يمكن تجاوزه بجعل عملية الحفظ تتم على دفعات، لذلك عمليا يمكن لكل لغة فعل ذلك. في هذه الجولة حجم الكتلة النصية 17 قيقا بايت، أي أكثر من 18 مليار حرف، عبر مليار و500 مليون تكرار، وهذه النتائج: 1500,000,000 - 17.1 GB
لم يخرج أحد في هذه الجولة ولكن هنا تفشل Python في حفظ الملف مثل C و Nim رغم أنها نجحت في توليده وبسرعة تفوقت بها على Go و Julia. لغة Go متأخرة كثيرا فهي أبطا الجميع بمسافة كبيرة، فبينها وبين C ما يزيد عن 11 دقيقة ، وبينها وبين اللغة التي تسبقها Julia ستة دقائق. لغة Perl بالنسبة لي هي مفاجأة هذا السباق، هي لغة قديمة ظهرت في 1987 بغرض معالجة النصوص في الملفات النصية وتحليلها واستخراج النتائج منها، وتطوّرت لتكون لغة متكاملة ، ولكن تراجعت شعبيتها بسبب غرابة تركيبها النحوي المختصر وأخذت مكانها لغة بايثون. ولأنها أصلا مصممة لمناولة النصوص وتحليلها، لذلك يمكن أن يكون هذا سبب تفوقها في هذا السباق. أيضا نلاحظ أن الفارق الزمني بدأ يتقلّص بين Rust ولغات C و C++. الجولة السابعة:تضخّمت الكتلة النصية لتبلغ 24 قيقا بايت من خلال 2 بليون تكرار، وهذه نتيجة الاختبارات: 2000,000,000 - 23.1 GB
تحية كبرى للغة Julia و لغة Perl ، صامدتان مع الكبار دون أن تفشلا في حفظ الملف. في الوقت التي خرجت فيه كل من Go و Python. أيضا يتاكد تقلّص الفارق الزمني بين Rust و C. الجولة الثامنة: (الأخيرة)تم زبادة حجم الكتلة النصية إلى مايقرب من 30 قيقا بايت: 2500,000,000 - 29.2 GB
في هذه الجولة خرجت المبجّلة C وكذلك Julia و Perl، ولم يبق إلا Rust و C++ و Nim . لغة Rust لازالت الأسرع وهي الوحيدة التي استطاعت حفظ الملف. الجولة بعد الأخيرة:تم زيادة عدد التكرارات إلى 3000 مليون مرة، و لم يفز أحد. 3000,000,000
نتيجة السباق :
ملاحظات:
يمكن مراجعة التفاصيل الفنية والملفات المصدرية والتنفيذية في منصة GitHub في الرابط التالي: https://github.com/shagrouni/langs_string_build_test أيضا يمكن متابعة النقاشات التي تمت حول هذا السباق في مجتمع لغة Rust في منصة Reddit: https://www.reddit.com/r/Rust/comments/1fe3fe7/handling_large_string_in_different_languages |