النتائج 1 إلى 13 من 13

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

  1. #1

    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) لانه رقم ثابت ولا تجري عليه أية عمليات حسابية .





    التعديل الأخير تم بواسطة خليل سليم ; 20-02-2008 الساعة 02:02 PM سبب آخر: العنوان خطأ
    __________________
    بريدي :khalilme (at) hotmail.com
    مطور: ASP.NET, Windows Phone , Desktop Applications


  2. #2
    عضو نشيط
    تاريخ التسجيل
    Jan 2008
    المشاركات
    176


    شكراااااااااااااااااا على مجهودك الرائع






  3. #3
    عضو نشيط جدا
    تاريخ التسجيل
    May 2006
    المشاركات
    431


    يديك الف عافيه






  4. #4
    عضو سوبر نشيط
    تاريخ التسجيل
    Mar 2000
    المشاركات
    762


    معلومات جميلة ولي عودة فيما بعد للتعلليق





    __________________
    Eng.Fedail
    Computer and Electronics Engineer

  5. #5

    تاريخ التسجيل
    Jun 2006
    المشاركات
    1,370


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

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

    اخي خليل لو توضح لنا بالشرح اكثر حول استخدام ال Cashing لان حسب مافهمت منك على الماسنجر انها مهمه جدا في تسريع عمليات الاستدعاء





    __________________
    @_@

  6. #6


    شكراً لك أخي علي الموضوع المميز





    __________________
    ahmed sliman .. Web Programmer
    ahmeds _ link @ hotmail . com

  7. #7
    عضو نشيط
    تاريخ التسجيل
    Apr 2008
    المشاركات
    85


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


    تحياتي
    نوكيا الشرق الاوسط






  8. #8


    بارك الله فيك اخى خليل معلومات اكثر من رائعة






  9. #9
    عضو سوبر نشيط
    تاريخ التسجيل
    Mar 2003
    المشاركات
    790


    أهلاً ..
    موضوع جيد .. و لكن لي ملاحظات ..
    1) *.ashx ليست ملفات Web Service بل هي ملفات Http Handlers .. ملفات الـweb Service تكون *.svc أو *.asmx ، فهل تقصد web service أم http handlers ؟ لأن كلاً من الحالتين له استخدامه
    2)الـCachingو ليس الـCashing يفيد في معظم الحالات ..
    3)بخصوص ملاحظة 18 .. الأفضل من وجهة نظري هو استخدام DB Provides تدعم مباشرة من الـ.NET مثل الـMS SQL Serverو الـOracle .. أما الـmySQL فهي ليست ضعيفة خاصة - حسب ما سمعت - إن شركة SUN اشترتها و لكن لها طرق أخرى في التشغيل ..
    4) بخصوص ملاحظة 19 .. الـStored Procedures حل ممتاز للحماية من الاختراق و لها أيضاً فايدة فصل كود الـDB و لكن يمكن استخدام الـADO.NET classes مباشرة مع استخدام Command.Parameters .. ستقوم أيضاً باللازم
    5) ملاحظة الـStringBuilder .. طبعاً كلامك سليم و لكن أعلق على نقطة "الحل الأول إذا كنت مبرمج سي شارب مجنون ... أقصد محترف أن تستخدم المؤشرات UnSafe Code وعندها أتمنى من الله أن يرعاك" ..
    المقصود هنا استخدام الـPointers و هو حل ممتاز في مسائل الـPerformance المعقدة .. أما في الأحوال العادية يفضل استخدام الـStringBuilder مباشرة .. و خاصة في Document-Flow Applications
    6) و بقية الملاحظات جيدة طبعاً و تأتي من الممارسة و البرمجة .. ( لم أقرأ كود ضغط الـView State ،،)

    ملاحظة أخرى على تحسين الـPerformance و لكنه من الحالات المتقدمة هو قراءة كود الـCIL و الوصول إلى أعلى قدر من الـOptmization .. فاستخدام ?: مثلاً أفضل من الـif()else العادية ..

    Dr.no





    __________________
    دكتور لا

  10. #10


    أخي أهلا بك

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

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

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





    __________________
    بريدي :khalilme (at) hotmail.com
    مطور: ASP.NET, Windows Phone , Desktop Applications

  11. #11
    عضو نشيط
    تاريخ التسجيل
    Sep 2007
    المشاركات
    50


    يعطيك الف عافية ياغالي وجاري التجربة الان






  12. #12
    عضو نشيط جدا
    تاريخ التسجيل
    Aug 2003
    المشاركات
    426


    الاخ خليل الف شكر على المجهود الرائع .
    صراحه موضوع متعوب عليه..
    ووفقك الله لما يحب ويرضى...
    أخوك سعد,انا داخل بعضويه اخي مابعرف لماذا لم تفعّل عضويتي
    انا العضو Desert Eagle







  13. #13
    عضو جديد
    تاريخ التسجيل
    Apr 2010
    المشاركات
    4


    رائع جداً بارك الله بك ع الشرح المميز





    __________________
    لمسات عربية





ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  

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