![]() |
|
تحسين الأداء-أفكـــار و تلميحات - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182) +--- قسم : قسم مقالات VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=184) +--- الموضوع : تحسين الأداء-أفكـــار و تلميحات (/showthread.php?tid=4950) |
تحسين الأداء-أفكـــار و تلميحات - RaggiTech - 03-10-12 كاتب الموضوع : Marwan
السلام عليكم و رحمة الله وبركاته
هذا المقال عبارة عن ترجمة غير حرفية لهذا المقال http://msdn.microsoft.com/en-us/library/ms973839.aspx ما أخذته من المقال هو الأفكار الرئيسية و الأمثلة ثم قمت بشرحها بطريقتي 1-أفكار عامة لتحسين الأداء لكل البرامج 2-أفكار لتحسين الأداء عند التعامل مع قواعد البيانات 3-أفكار لمبرمجي vb.net 1-أفكار لكل البرامج
رمي الاستثناءات يستهلك الكثير من موارد النظام لذا تأكد دوما من عدم رمي الكثير من الاستثناءات.
يمكنك التأكد من هذا الأمر باستخدام الكود التالي: أنشئ مشروعا جديدا من نوع Console Application في الإجراء Main اكتب الكود التالي: كود : Console.WriteLine(Date.Now.ToString)نهايتها. الآن احسب الفرق بين الوقتين لتعرف كم استغرق تنفيذ الكود. بالنسبة لي استغرق 19 ثانية(قد تختلف النتيجة حسب سرعة المعالج). الآن احذف السطر Throw New Exception ثم أعد تشغيل البرنامج. هل لاحظت الفرق؟ لقد استغرق تنفيذ الحلقة(5000 دورة) أقل من ثانية. لذلك في مشاريعك الحقيقة تأكد دوما من الفئات التي تستخدمها عن ما هي الاستثناءت التي ترميها فان كان عددها قليلا فعندئذ يمكنك السيطرة على الاستثناءات و التأكد من أنها لن ترمى بحال من الأحوال (باستخدام جمل الشرط أو غيرها)،أما ان كان عدد الاستثناءات كبيرا فليس لك مخرج الا استعمال التركيب Try و الذي لن يحول دون رمي الاستثناءات من الكود الذي يحمله لكنه سيمكنك من قنص هذه الاسنثناءات لتتمكن من معالجهتها في الجزء Catch من التركيب Try.
للتأكد من الفرق في السرعة بين استخدام الانواع ذات القيمة و الأنواع المرجعية أنشئ مشروعا جديدا من نوع Console Application ثم أضف الكود التالي: كود : Sub Main()بعد حساب الوقت المستغرق لكل دورةتحصلت على النتيجة التالية: بهذا يتبين لك الفرق الشاسع بين الأنواع ذات القيمة و الأنواع المرجعية من ناحية السرعة في التعامل معها. ضع في عين الاعتبار أن الكائنات التي تحتوي على حقول و خصائص(Fields and Properties) أكثر فان التعامل معها يصبح أبطأ ليس مثل هذاالبرنامج البسيط حيث أن كل كائن يحتوي على حقل واحد. لكن هنا يجب التنبيه على نقطة مهمة و التي قد تقلب الموازين: وهي سوء استخدام الأنواع ذات القيمة مما قد يؤدي إلى بطئ في الأداء بحيث لو أننا استخدمنا الأنواع المرجعية لكان الاداء أسرع، وهي قضية الصندقة و اللاصندقة(Boxing,Unboxing). -الصندقة: و هي عملية اسناد متغير من النوع ذو القيمة الى متغير من النوع المرجعي. -اللاصندقة: و هي تحدث عند استخدام المتغير بعد عملية الصندقة أو عملية اسناد متغير من النوع المرجعيالى متغير من النوع ذو القيمة. تحدث عملية الصندقة مثلا في الحالات التالية: -ارسال متغير من النوع ذو القيمة الى اجراء يستقبل وسيطة من النوع Object -اضافة متغير من النوع ذو القيمة الى مجموعة Collection (الا اذا قمت باستغلال الـGenerics) عملية الصندقة و اللاصندقة تؤدي الى استهلاك كبير من موارد النظام. 4 ثواني للحلقة الأولى 1 ثانية للحلقة الثانية
توفر ميكروسوفت تطبيقا يمكنك من ترجمة برنامجك إلى لغة الآلة كاملا و هو التطبيق ngen.exe(Native Image Generator) ملاحظة:هذا لا يعني عدم الحاجة الى الدوت نت فريمورك على الحهاز لكي يعمل التطبيق. يمكنك استخدام هذا التطبيق عن طريق سطر الأوامر Command Line و هو موجود على المسار C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 لتحويل مجمع الى كود الآلة استخدم سطر الأوامر التالي: كود : install [assembly Name or assembly Path]لارجاع المجمع الى حالته الأصلية: كود : uinstall [assembly Name or assembly Path]لعرض حالة المجمع كود : display [assembly Name or assembly Path]ملاحظة: في السطر الأخير اذا لم تحدد أي وسيطة للأمر فسيقوم بعرض حالة كافة المجمعات المنصبة على الجهاز. يمكنك أيضا أن تقوم بهذه العملية بعد القيام بعملية التنصيب للبرنامج على جهاز المستخدم عبر استخدام برنامج التنصيب (يمكنك البحث عن الطريقة فهي ممكنة و موجودة) بذلك تتفادى البطئ عند أول تشغيل.
التنفيذ اللامتزامن يعني أنه من الممكن تنفيذ الكود الحالي في خلفية البرنامج(في مسار جديد) بينما يواصل البرنامج تنفيذ الكود التالي في نفس الوقت. تحتاج الى التنفيذ اللامتزامن كثيرا عندما تعمل على قراءة و نقل وحدات تخزين بشكل كبير(مثل قراءة و نقل الملفات الكبيرة الحجم سواء على نفس الجهاز أو عبر الشبكة).لذلك فان كل الفئات التي تجري عمليات على وحدات التخزين(مثلا:FileStream,WebRequest,NetworkStream.. .) تدعم كلا النوعين المتزامن و اللامتزامن عبر الطرق: التنفيذ المتزامن التنفيذ اللامتزامن BeginRead Read BeginWrite Write طبعا في التنفيذ اللامتزامن يجب عليك كتابة الكود المناسب يدويا لاعلامك بانتهاء التنفيذ و يتم ذلك من خلال ارسال مفوض(Delegate) إلى الاجراء الذي سيتم استذعائه عند انتهاء التنفيذ، كوسيطة للطريقةBeginRead مثلا.ويمكنك أن تضع في هذا الاجراء الكود المناسب لاعلامك بانتهاء التنفيذ كأن تظهر رسالة مثلا. في المثال التالي استخدمت التنفيذ اللامتزامن لاستخراج كود HTML للصفحة الرئيسية للمنتدى،طبعا لو استخدمت التنفيذ اللامتزان لاستغرق هذ و قتا و لأدى الى تجمد الفورم في البرنامج. قم بانشاء مشروع جديد من نوع Windows Form ثم أضف TextBox Button RichtextBox الآن أضف الكود التالي ثم شغل البرنامج و اكتب في مربع النص http://www.vb4arb.com ٌBeginRead Read كود : Imports System.IO |