35 نکته بهبود perfomance (عملکرد صفحات وب)

نکته اول : پرهیز از رفت و برگشت اضافی به سرور :
چندین عملیات وجود دارد ( مانند تعیین اعتبار کردن اطلاعات وارد شده توسط کاربر ) که در انها نیازی به PstBack نیست و میتوانید و میتوانید این عملیات را به صورت Client Side انجام دهید ، به زبان دیگر هر وقت نیازی به خواندن یا نوشتن در پایگاه داده ندارید بهتر است از ایجاد رویداد PostBack جلوگیری کنید .در حالت عادی در صفحات ASP.Net کاربر روی دکمه ای کلیک میکند یا عملیات دیگری انجام میدهد که باعث رخ دادن PostBack میگردد ، صفحه و تمام کنترل های آن دوباره ساخته میشود ، کد ها روی سرور اجرا میشوند و یک نسخه جدید از صفحه در Browser رندر میشود .در برخی شرایط بهتر است که کد های سروری را بدون روی دادن PostBack اجرا کنیم ، در این شرایط میتوان از AJAX استفاده کرد .

نکته دوم : پرهیز از نگهداری View State کنترل ها در مواقع غیر ضروری
اداره کننده اتوماتیک شرایطی را برای کنترل های سرور ایجاد میکند که انها میتوانند در رفت و برگشت به سرور مقادیر خود را نگهدارند ، این عمل با پاس دادن به سرور و خواندن دوباره View State ها توسط Hidden Field انجام میگردد . در اینجا مهم این است که تشخیص دهید در چه زمانی View State ها به شما کمک میکنند و در چه زمانی کارایی صفحات شما را کاهش میدهند . برای جلوگیری از ذخیره شدن View State ، هر کنترل یک مشخصه به نام EnableViewState دارد که باید آن را برابر با False قرار داد، به مثالی در مورد DataGrid توجه کنید :    <asp:datagrid EnableViewState="false" datasource="..." runat="server"/>
در صفحه ای که نیاز به نگهداری هیچگونه View State نیست میتوان به صورت زیر عمل کرد :    <%@ Page EnableViewState="false" %>
برای مشخص کردن اینکه View State برای User Control فعال باشد یا نه خاصیت EnableViewState در دایرکتیو @ Control نیز وجود دارد .

 نکته سوم: Buffering را غیر فعال نکنید مگر اینکه دلیل خاصی برای غیر فعال کردن آن داشته باشید

نکته چهارم : برای انتقال به صفحات دیگر از متد Transfer متغلق به آبجکت Server استفاده نمایید ، البته باید به 2 نکته توجه کنید :
الف - در این روش هر دو صفحه مبدا و مقصد باید در یک Aplication باشند
ب - با استفاده از این روش URL در Browser عوض نمیشود و History نیز به روز نمیگردد ، بنابراین دکمه های Refresh و Back دیگر وظایف اصلی خود را انجام نمیدهند ، این روش بیشتر برای پروژه هایی توصیه میگردد که بنابر دلایلی نمیخواهید کاربران URL صفحات شما را داشته باشند ( البته کاربران غیر حرفه ای که اکثر کاربران در این دسته هستند )

نکته پنجم : در صورت نیاز نداشتن به Session State آن را غیر فعال کنید چون همه به آن نیاز ندارند :  
<%@ Page EnableSessionState="false" %>
اگر در صفحه ای نیاز به خواندن اطلاعات Session دارید ولی نمی خواهید آن را تغییر دهید یا پاک کنید میتوانید به صورت زیر عمل کنید :
<%@ Page EnableSessionState="ReadOnly" %>
اگر می خواهید Session State را در کل پروژه غیر فعال کنید می توانید در Web.config به صورت زیر عمل کنید :    <sessionState mode="Off" />

نکته ششم : برای ذخیره و بازیابی اطلاعات از SQL Server و Stored Procedure ها در آن استفاده نمایید .

نکته هفتم : برای خواندن اطلاعات از پایگاه داده از SqlDataReader استفاده نمایید که Performance بالاتری نسبت به DataSet به ارمغان می آورد .

نکته هشتم : هر موقع ممکن بود داده ها و خروجی های صفحه را Cache کنید .

نکته نهم : به غیر از مواقع ضروری از Encrypt کردن View State ها خود داری کنید .

نکته دهم : فقط در صورت لزوم Authentication را فعال کنید ، به صورت پیش فرض Authentication در ASP.Net در حالت Windows قرار دارد ، اگر به آن نیاز دارید بهتر است آن را در Machine.config غیر فعال کرده و در Web.config فعال کنید

نکته یازدهم : Encoding پیش فرض در دات نت UTF-8 می باشد ، اگر در پروژه خود فقط از کاراکتر های ASCII استفاده می کنید Encoding را روی ASCII تنظیم کنید

نکته دوازدهم : تا جایی که ممکن است در کد نویسی از Exception ها استفاده نکنید ، به مثال زیر توجه کنید ، کد شماره 2 نسبت به 1 ارجهیت دارد :
1 -
try
{
result = 100 / num;
}

catch (Exception e)
{
result = 0;
}

2 -
if (num != 0)
result = 100 / num;
else
result = 0;

نکته سیزدهم : صفحات پروژه خود را Precompile کنید ، برای این کار مراحل زیر را انجام دهید :
الف - یک پنجره Command باز کرده و به پوشه حاوی دات نت فریم ورک بروید :
windir%\Microsoft.NET\Framework\version

ب - asp_compiler را اجرا کنید :
aspnet_compiler -v /virtualPath

virtualPath به آدرس سایت شما روی IIS اشاره می کند ، اگر پروژه شما در IIS قرار ندارد به صورت زیر عمل کنید :

aspnet_compiler -p physicalOrRelativePath -v /

physicalOrRelativePath به آدرس کامل پوشه ای که فایل های پروژه در آن قرار دارد اشاره می کند

نکته چهاردهم : اگر می خواهید یک برنامه نویس واقعی وب باشید برید AJAX واقعی رو یاد بگیرید و هی از AJAX ویژوال استودیو (Update Panel) و این کامپوننت های آماده استفاده نکنید.

نکته پانزدهم : حذف کردن httpModule های بدون استفاده
httpModule ها موجودیتی هستند که یک سری پردازش بر روی تمام request ها انجام میدهند و بالطبع این پردازش ها وقت گیر هستند (حتی خیلی کم) ، بسته به ورژن دات نت یک سری از این httpModule ها در web.Config آن نسخه وجود دارد که در آدرس زیر در میتوانید آن ها را پیدا گنید :
$WindowsFolder\Microsoft.NET\Framework\$versiosn\C ONFIG
بهتر است httpModule های بدون استفاده را حذف کنید . به عنوان مثال اگر از WindowsAuthentication در پروژه خود استفاده نمی کنید در فایل web.Config پروژه خود (نه فایلی که در آدرس بالا هست) در قسمت httpModules یک تگ remove برای httpModule مورد نظر بنویسید :
   
<httpModules>
<remove name="WindowsAuthentication" />
</httpModules>

نکته شانزدهم : وقتی کار برنامه نویسی تمام شد <compilation debug=”true”> را غیر فعال کنید . اگر دقت کنید در web.Config دقیقا بالای همین خط یک کامنت وجود دارد که گفته است به خاطر اینکه روی Performance تاثیر دارد فقط در طول Development فعال باشد

اگر صاحب هاست هستید یا سرور اختصاصی دارید برای اینکه <compilation debug=”true”> در تمامی سایت های روی سرور غیر فعال شود در machine.config به صورت زیر عمل کنید :
   
<configuration>
      <system.web>
              <deployment retail=”true”/>
      </system.web>
</configuration>

نکته هفدهم : وقتی کار برنامه نویسی تمام شد tracing را غیر فعال کنید ، برای این کار در web.Config :
   
  <configuration>
      <system.web>
              <trace enabled="false" />
      </system.web>
</configuration>

نکته هجدهم : هر جا که میتوانید از اعتبار سنجی سمت سرور (Server-Side validation) پرهیز کنید و اگر در مواردی به مرورگر کاربر اعتماد ندارید باز هم از اعتبار سنجی سمت کلاینت استفاده کرده و هنگام دریافت اطلاعات از Page.IsValid بهره ببرید .

نکته نوزدهم : هیچوقت از Page.DataBind استفاده نکنید چون باعت بایند شدن تمام کنترل هایی که Binding را ساپورت میکنند میشود در صورتی که شما مثلا میخواهید فقط یک گرید یا یک ریپیتر بایند شود
نکته بیستم : در تعداد رکورد بالا از Data Paging / Sorting استفاده کنید . فرض کنید 5000 رکورد دارید و در هر صفحه از گرید 100 رکورد را نشان می دهید . در هر صفحه 4900 رکورد باقیمانده نشان داده نمیشوند که حافظه بالایی را مصرف میکنند .
نکته بیست و یکم : برای مقادیر عددی (String) به جای For از Foreach استفاده کنید
نکته بیست و دوم : بعد از try catch از finally استفاده نمایید تا مطمئن شوید که ارتباط با منابع (مثلا دیتابیس) حتما قطع شود .
نکته بیست و سوم : در کد نویسی دقت زیادی به خرج بدید و سعی کنید کد بهینه بنویسید ، البته این نکته خیلی کلیه ولی یه مثال :
به جای x = x + 1 بنویسید x+ = 1
نکته بیست و چهارم : کد های css ، javascript ، jquery و ... را در فایل های جداگانه بنویسید و از آن ها به صورت inline در صفحات aspx استفاده نکنید
نکته بیست و پنجم : وقتی میخواهید مقدار یک متغیر از نوع string را خالی کنید به جای "" = strText1 یا " " = strText1 از strText1=string.Empty استفاده کنید
نکته بیست و ششم : فقط در صفحاتی مانند ورود به سایت ، رجیستر ، دریافت اطلاعات حساب بانکی و ... که واقعا به SSL نیاز دارند از آن استفاده کنید .
نکته بیست و هفتم : اگر فقط قصد نمایش ساده اطلاعات رو دارید از Repeater به جای گرید و ... استفاده کنید ، چون ریپیتر مختص نمایش است و نیاز به انجام پروسه هایی برای ویرایش ، حذف ، صفحه بندی و ... ندارد .
نکته بیست و هشتم : برای انجام عملیات چند مرحله ای و سنگین از Response.IsClientConnected استفاده کنید .

نکته بیست و نهم : اگر کنترلی در صفحه دارید که در شرایطی باعث PostBack می شود حتما در Page_Load از Page.IsPostBack استفاده کنید .
   void Page_Load ( Object sender, EventArgs e )
{
    if (!Page.IsPostBack)
      {
           //Your codes
       }
}

نکته سی ام : برای الحاق کردن مقادیر رشته ای (string) از StringBuilder استفاده کنید
نکته سی و یکم : در دیتابیس بهترین و کوچکترین نوع داده (Data type) رو برای هر Column انتخاب کنید ، مثلا برای مقادیر تاریخ از varchar یا ... استفاده نکنید .
نکته سی و دوم : سعی تا حد امکان در دیتابیس از کلید های خارجی Null پذیر استفاده نکنید تا تعداد outer join ها محدود شود . چون outer join ها منابع بیشتری از سیستم نسبت به inner joins ها مصرف می کنند و باعث پایین آمدن Performance میشوند .
نکته سی و سوم : در دیتابیس برای column هایی که مقادیر رشته ای کمتر از 8000 کاراکتر را در خود ذخیره می کنند از varchar استفاده کنید نه از text
نکته سی و چهارم : فقط سطر و ستون های مورد نیاز را select کنید و حتی الامکان از Select * from table استفاده نکنید
نکته سی و پنجم : از SQL Profiler برای تشخیص query هایی که زمان زیادی برای اجرا لازم دارند ، استفاده کنید .

نکته غیر مرتبط : با استفاده از Entity Framework پروژه زودتر تموم میشه ، یا بهتره بگم Performance کد نویسی بیشتر میشه !