مقارنة سرعة لغات البرمجة باستخدام مثال على حل مشكلة تدريب الشبكة العصبية

الغرض من العمل


قارن سرعة البرامج المكتوبة بلغات مختلفة وتعمل على أنظمة تشغيل مختلفة. نتائج العمل مثيرة للاهتمام في المقام الأول لحل المشاكل المرتبطة بالشبكات العصبية.

الحديد ونظام التشغيل


للاختبار على Ubuntu و Windows (كمبيوتر محمول DELL Inspiron-7577):

ذاكرة الوصول العشوائي: 16 جيجا بايت

وحدة المعالجة المركزية: Intel Core i7-7700HQ @ 8x 3.8GHz


تين. 1 (إخراج أوامر screenfetch على الكمبيوتر المحمول DELL Inspiron-7577 تحت Ubuntu OS )

للاختبار على MAC:

RAM: 8

جيجا بايت CPU: Intel Core i7 2.7GHz

لقد اختبرنا أيضًا على Raspberry pi 4: 

RAM: 4Gb

CPU: ARMv7 rev 3 (v7l) @ 4x 1،5Ghz


تين. 2 (إخراج أمر screenfetch على التوت pi 4 )

برنامج الاختبار


لإجراء الاختبارات ، تم محاكاة برنامج يقلد شبكة من 5 خلايا عصبية ، والهدف من البرنامج هو معرفة كيفية حل مشكلة العثور على دلتا حصرية أو بدقة = 0.01 بشكل صحيح. تم أخذ جميع معلمات وخصائص الشبكة العصبية ، بالإضافة إلى خوارزمية التشغيل والتدريب من هاتين الوظيفتين:

https://habr.com/en/post/312450/

https://habr.com/en/post/313216/

كانت التغييرات الوحيدة يتم إدخالها في المعاملات E (إبسيلون) - سرعة التعلم ، α (ألفا) - لحظة (E = 0.3 ، α = 0.5). عند استخدام القيم الموضحة في المقالة ، لم تتمكن الشبكة العصبية لفترة طويلة (8 ساعات) من إيجاد حل.

من خلال هيكله ، يعد البرنامج نوعًا من نموذج OOP الذي تعمل فيه فئة NeuronNet مع صفائف من الكائنات من فئة Neuron و Sinaps. يحتوي كائن من فئة Sinaps على مراجع لكائنين من فئة Neuron. بالنسبة لحسابات النقطة العائمة ، يتم استخدام نوع البيانات المزدوج.

خوارزمية الاختبار: 

  1. يتم إنشاء كائن من فئة NeuronNet.
  2. اجتياز مجموعة تدريب اختبار. يتم عرض نتائج عمل الشبكة العصبية قبل التدريب وبعده في وحدة التحكم وتستخدم للمقارنة مع النتائج المرجعية.
  3. يدخل البرنامج في دورة لا نهاية لها حيث مرة واحدة في 100000 نتيجة. إذا كان الخطأ أقل من دلتا = 0.01 ، تنتهي الدورة اللانهائية. في المستقبل سأدعو كل هذه المقارنة حقبة. عندما يمر العصر والوقت المستغرق ونتائج حساب الشبكة العصبية لكل قيمة من الجدول الذي يستبعد أو يتم عرضه في وحدة التحكم.
  4. بعد الخروج من الدورة ، يطبع البرنامج الوقت المنقضي من 0 إلى آخر عصر وينتهي.

تمت كتابة البرنامج في الأصل في python3 (https://gitlab.com/di.romanov/neuron1.git) ، وترجم بعد ذلك إلى Java و Kotlin و C ++ (gcc) و php7 و ruby


تين. 3 (مثال على إخراج برنامج مكتوب بلغة Kotlin يعمل تحت نظام Ubuntu OS)

نتائج الإختبار


عند العمل ، أعطت البرامج المكتوبة في Kotlin و Java و php و ruby ​​و Python نفس الإجابات بعد مجموعة التدريب.كان الناتج بعد مجموعة التدريب لبرنامج مكتوب في C ++ مختلفًا ، مما أدى إلى تغيير في عدد العصور التي تتطلبها للتدريب المناسب. لهذا السبب ، سيتم إعطاء كل من مقارنات وقت تشغيل البرنامج بالكامل والوقت المستغرق لإكمال عصر واحد.

وقت التدريب [ms.]
أوبونتوشبابيكRaspbianماك
بيثون104569204239521112335621
Kotlin49684877199637775
جافا48925994179737652
روبي7968490524457229
C ++100990212000505377
بي أتش بي75591131170513996

التبويب. 1 (وقت مرور جميع العصور قبل تدريب الشبكة العصبية) 

زمن السفر لعصر واحد [ms.]
أوبونتوشبابيكRaspbianماك
بيثون8713169424331527576
Kotlin3924051631625
جافا3954851434635
روبي6667756638040
C ++4185883421057
بي أتش بي63811001243168

التبويب. 2 (الوقت يمر عصر واحد) 

تحليل النتائج



رسم بياني. 1 (وقت مرور جميع العصور للبرامج التي تعمل على نظام التشغيل Ubuntu)

كما هو متوقع ، أظهر Kotlin و Java نفس سرعة العمل قبل Python بنحو 20 مرة. دعونا نتأمل بعض الملاحظات غير الواضحة.

كانت نتائج برنامج مكتوب بلغة C ++ بطيئة بشكل غير متوقع. جزئيًا ، يمكن تفسير ذلك من خلال العدد الكبير من العصور التي استغرقتها للعثور على الإجابة الصحيحة. ومع ذلك ، حتى مع أخذ ذلك في الاعتبار ( انظر الرسم البياني 2 ) ، فإنه يتخلف عن برامج Java بسرعة. 


رسم بياني. 2 (وقت مرور لعصر واحد للبرامج التي تعمل على نظام التشغيل Ubuntu)

قد يكون السبب الآخر لمثل هذه النتائج هو الاستخدام المختلف لموارد المعالج ( انظر الشكل 4 ، الشكل 5 )


. 4 ( Ubuntu Kotlin)




تين. 5 (مخرجات شاشة منفذ Ubuntu أثناء تنفيذ برنامج مكتوب بلغة C ++)

كما ترى ، تستخدم Java 4 نوى على الأقل في كل مرة ، بينما يستخدم برنامج C ++ واحدًا. ومع ذلك ، لا يمكن أن يفسر هذا تفوق السرعة 8 مرات ، لأن Java لا تستخدم جميع النوى إلى 100 ٪.

اختلافات كبيرة في سرعة برنامج مكتوب بلغة Python حسب نظام التشغيل. عند تشغيل برامج Java على أنظمة تشغيل مختلفة ، لم تكن الاختلافات في السرعة أكثر من 40٪ (حتى على أجهزة مختلفة ، باستثناء التوت) ، ولكن عند بدء تشغيل برنامج Python ، تم الحصول على القيم التالية: Ubuntu - 104c ، Windows - 204c ، MAC - 335c . نسبة سرعة البرنامج على Kotlin إلى سرعة البرنامج في Python هي 21 لنظام التشغيل Ubuntu ، و 26 لـ Raspberry و 43 بالفعل لنظام التشغيل Mac.

أظهرت جميع لغات البرمجة المترجمة نفس السرعة على Raspbery

Python3 مؤلفو الترجمة


روبي ، php

https://vk.com/silverlumen

Java

https://vk.com/id365699827

All Articles