الأربعاء، 15 سبتمبر 2010

22 طريقة لتحسين أداء وتسريع موقع مبرمج ب ASP.NET




----- تسريع الكود

هذه الطريقة من أقلها تأثيرا في الأوقات المعتادة ولكنها فعالة عندما يزداد الضغط على السيرفر ( مثلا زيادة الزوار ) لأن تأثيرها ضئيل غالبا .
.. إذا كنت ستبني موقع فوق المتوسط عليك التركيز هنا .

1- التحويل إلى أحدث إصدار من إطار عمل الدوت نت.

هذه أول ميزة وأهمها لأن كل إصدار يكون فيه الكثير من التحسينات وأكثر أمانا وووو إلخ .

فمثلا الإصدار الثاني من asp.net أسرع من الإصدار 1.1 أحيانا بنسبة 70% في الأداء .

2- استخدام البرمجة الكائنية في الأسلوب

هذا بداية يسهل عليك قراءة الكود وتعديله وثم يسرع عملية المعالجة بسرعة كبيرة فمثلا .

لا أقصد هنا فقط آلية كتابة الكود ولكن الكتابة الصحيحة باستخدام المبادئ الصحيحة

فمثلا :

** الربط المتأخر بالفيجوال بيسك عملية بطيئة .ٍ.
** الصندقة واللاصندقة أيضا ينتج عنها بطء ، وهنا أيضا اسخدام مثلا ال Generics في مجموعة تأخذ نص بدلا مما تأخذ كائن كما بالإصدار السابق وهذا يحسن الأداء بسرعة كبيرة.
** المتغيرات الستاتيكة أبطأ من غيرها .
** تعريف متغير انتجر في حين أن العدد المسند له هو عمر إنسان ، وعمر الانسان لا يفوق ال 255 سنة في بلادنا هذه الا إذا كنت تبني موقع ليزوره سكان اليابان أو سكان المناطق النائية باقريقيا .
** استخدام كلمة Overloads عند إعادة القيادة.
** تعريف كائنات وعدم قتلها ويفضل استخدام Using End Using ( using () { } للسي شارب) .



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



3- استخدام فئة StringBuilder بدلا من فئة String معتادة 

جميعكم يعلم بأن الكود التالي 
كود:
 Dim name As String = "Khalil"
        name += " Saleesm"

يقوم فقط بنقل مؤشر المتغير في الذاكرة إلى مؤشر جديد وبقاء القيمة القديمة الى أن تقرر ال GC قتله

وتصور أنك تقرا من قاعدة تقرأ وكل شوية تكتب += 
مئات المتغيرات ستقوم بإنشائها وهكذا تستهلك مصادر النظام

ما الحل ؟؟

هناك حلان

الحل الأول إذا كنت مبرمج سي شارب مجنون ... أقصد محترف أن تستخدم المؤشرات UnSafe Code وعندها أتمنى من الله أن يرعاك

أو الحل الثاني أن تستخدم فئة ال StringBuilder
كود:
        Dim sb As New System.Text.StringBuilder("Khalil")
        sb.Append(" Saleem")

استخدم الدالة أبند للإضافة وعليك بالبحث عن باقي خصائص الفئة لانني لست هنا بصدد شرحها

هكذا يتم التعديل ديناميكيا على نفس القيمة وترفير الكثير من المساحة في الذاكرة .

4- استخدم الويب سيرفس ( .ashx ) 
الويب سيرفس أسرع في الأداء في بعض الاستخدامات بكثير من الصفحات العادية وهذا خصوصا عند استخدامها مع الأجاكس حاليا .

** الاتصال بقاعدة البيانات ( لي وقفة مع قواعد البيانات ولكن هنا أتكلم عن الكود )

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

6- ال DataReader أسرع بثلاث مثلا من ال DataAdapter فعندما يمكن استخدام الطريقتين بنفس الآلية قدم الداتا ريدر.


----- إعدادات الموقع والصفحات

7- أهم ميزة بنظري هي ال ViewState وأرجو الانتباه لها

بامكانك تعطيلها من الويب كونفج لكل الموقع
كود:
    <pages enableViewState="false" />
أو من صفحة معينة
كود:
<%@ Page Language="VB"  EnableViewState="true"
او من أداة معينة 
كود:
<asp:Label ID="Label1" runat="server" EnableViewState="false" ></asp:Label>

مع الانتباه لكونك تفهم آليتها وما سيرتيب عليها

ولو تم تعطيلها من صفحة فإن الوقت اللازم لتحميل الصفحة سيتناقض إلى النصف في بعض الاحيان ويزيد عن النصف في أحيان أخرى .

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


9- قم بالغاء الطلبات الغير مستخدمة و الغير لازمة في قسم الاعداد <httpModules> كالغاء مثلا المصادقة بالوندوز أو بالهوتميل إذا كنت تستخدم مصادقة ال فورمز

أو الغي البروفايل إذا لم تستعمله ... إلخ 
كود:
<httpModules>
              
      <remove name="WindowsAuthentication" />
         <remove name="PassportAuthentication" />
10- استخدم ضغط ViewState عند الطلبات 
كود:
using System;
using System.IO.Compression;
using System.IO;
using System.Web.UI;
public class CompressedViewStatePage : System.Web.UI.Page
{
static public byte[] Compress(byte[] b)
{
MemoryStream ms = new MemoryStream();
GZipStream zs = new GZipStream(ms, CompressionMode.Compress);
zs.Write(b, 0, b.Length);
return ms.ToArray();
}
static public byte[] Decompress(byte[] b)
{
MemoryStream ms = new MemoryStream(b.Length);
ms.Write(b, 0, b.Length);
// last 4 bytes of GZipStream = length of decompressed data
ms.Seek(-4, SeekOrigin.Current);
byte[] lb = new byte[4];
ms.Read(lb, 0, 4);
int len = BitConverter.ToInt32(lb, 0);
ms.Seek(0, SeekOrigin.Begin);
byte[] ob = new byte[len];
GZipStream zs = new GZipStream(ms, CompressionMode.Decompress);
zs.Read(ob, 0, len);
return ob;
}

protected override object LoadPageStateFromPersistenceMedium()
{
byte[] b = Convert.FromBase64String(Request.Form["__VSTATE"]);
LosFormatter lf = new LosFormatter();
return lf.Deserialize(Convert.ToBase64String(Decompress(b)));
}
protected override void SavePageStateToPersistenceMedium(
object state

)
{
LosFormatter lf = new LosFormatter();
StringWriter sw = new StringWriter();
lf.Serialize(sw, state);
byte[] b = Convert.FromBase64String(sw.ToString());
ClientScript.RegisterHiddenField("__VSTATE",
Convert.ToBase64String(Compress(b)));
}
}
وثم قم بوراثة الصفحة هكذا
كود:
public partial class MyPage : CompressedViewStatePage
If




11- تمكين دعم ضغط ال HTTP 
مثلا كنت تستخدم IIS قديم ( الإصدار 5 ) وغير قادر على الولوج لاعداداته
او تريد ان تضغط قسم معين
كود:
<configSections>
<sectionGroup name="blowery.web">
<section name="httpCompress"
type="blowery.Web.HttpCompress.SectionHandler,
blowery.Web.HttpCompress"/>
</sectionGroup>
</configSections>
<blowery.web>
<httpCompress preferredAlgorithm="gzip" compressionLevel="high">
<excludedMimeTypes>
<add type="image/png" />
<add type="image/jpeg" />
<add type="image/gif" />
</excludedMimeTypes>
</httpCompress>
</blowery.web>
وثم استدعيه في ال pipeline
كود:
<httpModules>
<add name="CompressionModule"
type="blowery.Web.HttpCompress.HttpModule,
blowery.web.HttpCompress"/>
</httpModules>

12- استخدام الأجاكس
الأجاكس تقوم بتحديث جزء من الصفحة بدلا من كل الصفحة مع اخذ الاعتبار زيادة حجم الصقحة إذا لم تكن تعلم الكثير عن الأجاكس

13- استخدم الجافا سكريبت والسي اس اس والمعايير الصحيحة
الجافا سكريبت توفر عليك الكثير من طلبات السيرفر الغير لازمة كاستخدام أدوات التحقق Validation Controls او كتابة كودك الخاص عند الحالات الخاصة 
وعند ذكر الجافا سكريبت حبيت أن أذكر السي اس اس CSS فهي تخزن على جهاز المستخدم وتوفر ولو قليلا ولكنها مع المعايير تجعل موقعك يفتح بنفس الشكل على كل المتصفحات

14- استخدام ال Cashingفعلا من أعظم ما قد يساعد في توفير الحمل على السيرفر أو قاعدة البيانات ( مع زيادة الحمل على الذاكرة ) إذا تم استخدامها بالشكل الصحيح هي الكاشنج

فمثلا بدلا من أن تتصل بقاعدة البيانات 5000 مرة في الدقيقة ( بفرض وجود ألف زائر وكل صفحة بها خمس طلبات من القاعدة ) ستقوم بالاتصال مرة واحدة

تصور من 5000 آلاف إلى واحد

ابحث بجوجل عن الكاشنج وستجد مئات المواضيع المفيدة

15 - استخدم أدوات HTML بدلا من أدوات <asp:xxxxx runat="server" ( ادوات ال asp.net التي تعمل على السيرفر )

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



16- استخدام آخر نسخة من خادم IIS لوجود الكثير من التعديلات عليه والخوارزميات الجديدة .. فمثلا الإصدار 5 يجب تفعيل ضغط الصفحات ، الإصدار 6 وثم 7 تجد أن هذا الخيار مفعل تلقائيا .
وهذا يعني أيضا اختيار سيرفر محترم وسريع وليس سيرفر به ألف موقع على رام 2 جيجا فالشركات التي تهتم بالتحديثات تهتم بالأداء غالبا .


17- استخدم آخر التقنيات والأدوات.
مثلا عند اتسخدام ال Membership الخاصة بمايكروسوفت تكوت قد كسبت السرعة والأمن والراحة ووو الكثير من الأمور التي تتطلب منك وقت كثير وكذلك استخدام ال Profile أو استخدام برمجة تطبيقات قواعد البيانات بنظام الطبقات N Tier
فالتقنيات والأدوات أتت من أناس خبراء أمضو سنون العمر في التحليل والبرمجة ( لا أقول للمتخصصين أنها أفضل فهم يعلمون أن أكوادهم في بعض المناطق تعطي أداء أفضل ).

------ قاعدة البيانات 


18- استخدم قواعد بيانات قوية مميزة 
مثل مايكروسوفت سكول وأوراكل وابتعد عن الاكسيس والماي سكول ( تاعون البي اتش بي بيزعلوا ) فهي من شركات يكفي اسمها ودعمها .

19- استخدم دائما ال Stored Procedures

فهي أسرع وأكثر أمانا من غيرها ... ولا تستخدم على الإطلاق commandtext="select ..... where name ='" + Textbox1.Text + "''
فعندما تقوم بعملية الإضافة بالشكل + تكون قد سلمت موقعك ضحية للمخترقين

20-استخدام الIndex

أهم شي في القاعدة عند وجود أعمدة تجلب البيانات حسبها ( كالبحث ) أن تستخدم Index صحيح وعلى الأعمدة التي سنقوم باجراء البحث عليها مثل الرقم الفريد للموظف او اسم الطالب في المدرسة أو حسب تحليلك ففي موقع السيارات العربية تقريبا يوجد اندكس على معظم حقول جدول السيارات لان البحث يتم بالشركة والموديل والسنة واللون والمحرك وووو..
وصدقوني فالاندكس الخفيف الصحيح يسرع البحث ويوفر على السيرفر عشرات عشرات الأضعاف إن لم يكن في بعض الأحيان عشرات المئات في الجدوال الكبيرة والعمليات الكثيرة.

21- عند كتابة جملة Select لا تجلب كل الحقول ب * ... اجلب فقط الحقول التي تلزمك وفقط ... الا اذا كانت تلزمك كل الحقول .

22- استخدم أنواع الحقول الصحيحة فالنوع tinyint للعمر وليس النوع int مباشرة والنوع بت لذكر او انثى ... ورقم الهوية لا تستخدم رقم بل استخدم Char(9) لانه رقم ثابت ولا تجري عليه أية عمليات حسابية .


منقول

هناك تعليق واحد:

  1. Nice Topic :) and helpful

    I have a simple note on point 14
    It is "Caching" note "cashing"

    Thanks for the good Topic :)

    ردحذف