سؤال

كنت أناقش الشبكات العصبية (NN) مع صديق على الغداء في أحد الأيام وادعى أن أداء NN المكتوب بلغة Java سيكون مشابهًا لأداء NN المكتوب بلغة C++.أعلم أنه باستخدام تقنيات المترجم "في الوقت المناسب" يمكن لـ Java أن تعمل بشكل جيد جدًا، لكن بطريقة ما لا أشتريها.هل لدى أي شخص أي خبرة من شأنها أن تلقي الضوء على هذه القضية؟ هذه الصفحة هو مدى قراءتي للموضوع.

هل كانت مفيدة؟

المحلول

يمكن لـ Hotspot JIT الآن إنتاج التعليمات البرمجية أسرع من C++.والسبب هو التحسين التجريبي لوقت التشغيل.

على سبيل المثال، يمكن أن نرى أن حلقة معينة تأخذ الفرع "الخاطئ" بنسبة 99% من الوقت وتعيد ترتيب تعليمات كود الجهاز وفقًا لذلك.

هناك الكثير من المقالات حول هذا.إذا كنت تريد كل التفاصيل، اقرأ ورقة بيضاء ممتازة من الشمس.لمزيد من المعلومات غير الرسمية، جرب هذه.

نصائح أخرى

سأكون مهتمًا بإجراء مقارنة بين Hotspot JIT والتحسين الموجه بالملف الشخصي C++.

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

على أية حال، عادة ما تكون تحت رحمة المشروع الأكبر، باستخدام نفس اللغة المكتوبة بها.أو ستكون تحت رحمة القاعدة المعرفية لزملائك في العمل.أو ستكون تحت رحمة النظام الأساسي الذي تستهدفه (هل يتوفر JVM في البنية التي تستهدفها؟).في الحالات النادرة التي تتمتع فيها بالحرية الكاملة وتكون على دراية باللغتين، قم بإجراء بعض المقارنات مع الأدوات المتوفرة لديك.هذه هي الطريقة الوحيدة حقًا لتحديد الأفضل.

الجواب الوحيد الممكن هو:اصنع نموذجًا أوليًا وقم بالقياس بنفسك.إذا كانت تجربتي ذات أهمية، فإن Java وC# كانا دائمًا أبطأ بكثير من C++ بالنسبة لنوع العمل الذي كنت أقوم به - وأعتقد أن ذلك يرجع في الغالب إلى الاستهلاك العالي للذاكرة.بالطبع، يمكنك التوصل إلى نتيجة مختلفة تماما.

لا يتعلق هذا بشكل صارم بأداء C++ مقابل Java ولكنه مع ذلك مثير للاهتمام في هذا الصدد:أ ورق حول أداء البرامج التي تعمل في بيئة جمع البيانات المهملة.

إذا كان جمع البيانات المهملة الزائد أمرًا مثيرًا للقلق، فيمكنك دائمًا إعادة استخدام الكائنات غير المستخدمة عالية الأداء.

قم بإنشاء مصنع يحتفظ بقائمة انتظار من SoftReferences للكائنات المعاد تدويرها، وذلك باستخدام تلك قبل إنشاء كائنات جديدة.ثم في التعليمات البرمجية التي تستخدم هذه الكائنات، قم بإرجاع هذه الكائنات بشكل صريح إلى المصنع لإعادة تدويرها.

ربما C++، على الرغم من أنني أعتقد أنك بالكاد ستلاحظ الفرق إلى جانب وقت بدء التشغيل البطيء.لكن Java تجعل التطوير أسرع والصيانة أسهل.

في المخطط الكبير للأشياء، أنت تناقش ربما فرقًا في الأداء بنسبة 5٪ حيث يمكنك الحصول على عدة أوامر من حيث الحجم من خلال الانتقال إلى CUDA أو الأجهزة المخصصة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top