الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تحسين البرامج والتطبيقات

بدأه MohamedIBrahim في 25 يناير 2012 · 1 رد · 1,934 مشاهدة · في المواضيع المميزة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمه الله وبركاته قرأت عدة مرات حول هذا الامر فى الاسمبلي وخاصة فى الجزء الاخير من كتاب Art Of Assmbley وترجمة بعض المحتويات

لذا أود اطلاعكم علي بعض المعلومات والتفاصيل حوله

كيف يمكنني أن أجد الكود (التعليمات) الذي يسبب بطئ فى برنامجي (تطبيقي) ؟

يمكن ان نلخص ان الحل الآمثل فى ذلك هو ايجاد التعليمات التي يقضي التطبيق فى تنفيذها المدة الاطول فى البرنامج ومحاولة عمل Optimization لها

وهناك 4 أساليب (تقنيات) يستخدما المبرمجين فى حل تلك المعضلة ويستخدموها فى ايجاد "hotspots" وهو الاماكن التي يقضي عندها التطبيق معظم الوقت

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

الاسلوب الثاني والذي يستخدمه الكثيرين هو تحسين أداء كل شئ بل وحتي يمكن ان تصل الي حد اعادة كتابة وتحسين كل التعليمات

الاسلوب الثالث وهو أكثر منطقية هو تحليل التطبيق أو البرنامج وهو فى وجهة نظري أكثر عقلانية من سابقيه

الاسلوب الرابع هو استخدام profiler أو اي software monitoring tool أخر ليقوم بالتأكد من أداء بعض الاجزء المعينة فى التطبيق وبعد تحديد hotspot معينة فان المبرمج يحاول ان يحلل ويحسن ذلك الجزء او الاجزاء من البرنامج

ان اسلوب التجربة والتدقيق الكلي لسوء الحظ هو الاسلوب المنتشر والمبرمج عادة يقوم بتسريع بعض الاجزاء فى تطبيقه من خلال تخمين بعض الاجزاء والتعليمات التي تسبب بطئ فى التطبيق عند التنفيذ واذا كان التخمين صحيحا وايضا التحسين كان صورة جيدة فان التطبيق سيكون أسرع

وهذا الاسلوب يتبعه المبرمجين اصحاب الخبرة لتحديد وتحسين البرنامج من ناحية السرعة بشكل سريع لكن على النقيض فان معظم المبرمجين ما يخمنون تخمينات معظمها خاطئة فيخطئون فى تحسين اجزاء من البرنامج ليست السبب الرئيسي فى هذه المشكلة

لذا فان المجهود هنا يكون قد ضاع بلا فائدة واحيانا ما يسبب هذا التخمين الخاطئ مشاكل أخري والي حد كبير من الاسباب الرئيسية لفشل ذلك الاسلوب هو انه دائما ما يكون الخيار الاول للمبرمجين المبتدئين او من ليست لديهم الخبرة فى المجال والذين لا يستطيعون بسهولة تحديد وادراك الجزء الذي يسبب البطئ وللاسف هم لا يملكون معرفة باستخدام اي اساليب أخري لتخطئ هذا الامر

اما الاسلوب الثاني والذي ذكرته سابقا وهو محاولة تحسين كل شئ (optimize everything) وبالتأكيد فان هذا الاسلوب لا يصلح عموما مع البرامج الضخمة والمعقدة لكن بالنسبة للاجزاء الصغيرة من التعليمات فانه يعمل جيدا

لكن بعد ذلك سيكون هذا النص مثالا قصيرا من مشكلة optimization الخاصة ببرنامجك وسوف تستخدم وقتها هذا الاسلوب فى تحسين برنامجك وبالطبع كما ذكرنا مسبقا ان هذا الامر معقدا جدا مع البرامج الضخمة والكبيرة واحيانا كثيرة يكون غير مجدي ناهيك عن تضييع الوقت وبغض النظر عن البرمجيات الكبري فانك عندما تطبق هذا الاسلوب فلن يكون عليك القلق بعد ذلك من التحليل او قياس الاداء والفاعلية الا فى حالات خاصة كأن تحتاج للتعديل بعد ذلك

وذلك لانك قد قمت بتحسين أداء كل تعليمات ومهمات برنامجك

أما الاسلوب الثالث والذي أيضا ذكرناه هو التحليل فانه الاصعب من بين ال4 اساليب فباستخدام تلك الوسيلة فانك تدرس تعليمات برنامجك جيدا وتحديد الاجزاء التي تأخذ الوقت الاطول فى التنفيذ بالاعتماد على البيانات المتوقعة من العملية وتحليل المخرجات ومطابقتها بالمقارنة مع المدخلات وقياس العمليات الداخلية

بالنسبة للجزء النظري فان هذا الاسلوب هو الافضل

أما اذا نظرنا الي الواقع العملي فان الانسان بشكل عام كل يوم علي نفوره من عملية التحليل الي قدر الامكان يحاول الابتعاد عنه (لاحظ انني هنا اتكلم عن واقع وبشكل عام وليس الاصح او الاستثناءات او الجزء المحترف من المبرمجين )

وفى الواقع ان عملية التحليل ليست دائما صحيحة فهي تعتمد على خبرة الشخص وايضا التوقع قد يكون خاطئ والعامل البشري داخل فى الامر وعملية التحليل تستغرق مهماتها وقتا كبيرا للانتهاء منها

وبالرغم من مشاكل عملية التحليل فانك يجب ان تستخدمها كأسلوب أول للتعامل الواقعي مع تحسين أداء برنامجك فان عادة معظم البرامج تستهلك الوقت الاكبر لها فى تنفيذ ( Loops ,function calls ...الخ )

لذا يجب عليك التعامل بدقة اكبر مع تلك النقاط فيجب عليك مراجعة Loop body وخاصة nested Loops و تحديد كل recursive function calls المتواجدة فى برنامجك فالفرص كبيرة فى ان برنامجك يقضي الوقت الاطول فى تنفيذ تلك المهمات فى تلك المناطق من تعليمات برنامجك لذا فان تلك Spots اساسي ان تنظر اليها وتضعها فى اعتبارك عند عملية الoptimization

وبالرغم من ان اسلوب التحليل يعطي طريقة جيدة لمعرفة Slow Code فان عملية التحليل ل Program نفسها بطيئة وهي عملية مملة فى معظم الاحيان ومن الممكن جدا الخطأ اثناء ادائها وخاصة فى النقطة الخاصة ب recursive function calls (عن تجربة شخصية)

وكذلك فان تحديد الnested Loops التي التي تستهلك الوقت أمرا صعبا وليس سهلا على الاطلاق

فى النهاية فان النصيحة التي دائما ما يمكن تقديمها هي انه فى عملية الoptimization لبرنامجك فضع أسلوب analysis دائما كخيار أول

ولآن معظم المبرمجين لا يجيدون بشكل كامل تحليل برمجياتهم للعثور علي hotspots فان الاتجاه الان يكون نحو أتمتة تلك العملية أي جعلها تحدث بشكل تلقائي ومصطلح الاتمتة هو التعريب الذي وجدته ل(automation)

وهذا الامر يتم عن طريق profiler حيث يقوم بتلك العملية عنك :wink: والprofiler هو برنامج واداة صعيرة تقيس الوقت الذي يستهلكه الجزء المحدد من تعليمات برنامجك وبالطبع فانك ستريد استخدام ذلك الاسلوب باستخدام profiler وهو ما قدمته لنا شركات عديدة فانك تحتاج الي profiler Program وهناك شركات مثل Borland و Microsoft تقدم لنا العديد من ادوات وبرمجيات profiler لمساعدة المطورين والمبرمجين مع optimization tools الاخري

وهناك نوعان منه

  • Flat profiler
  • Call-graph profiler

وتلك بعضها

CLR Profiler

gprof

ويتواجد ضمن JVMTI وهي مجموعة أدوات خاصة بلغة جافا profiler

المصدر كتاب Art Of Assmbley وبعض المقالات التي كنت قرأتها سابقا وبعض الخبرات فى هذا الامر

والله ولي التوفيق

2

GoodBye

#2

السلام عليكم..

جميل جدًا. كنت أبحث عن هذا الأمر منذ فترة.

بارك الله فيك، و جزاك خيرًا.

و شكرًا.

مواضيع مشابهة