PDA

View Full Version : آموزش: ترجمه مقاله ارتقاء Performance سایت از Microsoft



maxpayn2
شنبه 07 مهر 1386, 11:48 صبح
سلام به همگی
همیشه برای من این سوال مطرح بود که چی کار کنم تا سرعت سایتم بالا بره ، در همین تالار یک تاپیک زدم و سوال کردم که جناب arsp_2004 (http://barnamenevis.org/forum/member.php?u=33355) چند لینک مفید از MSDN به من معرفی کردند ، من نیز مشغول مطالعه و ترجمه آنها شدم ، پس از اتمام ترجمه تصمیم گرفتم آن را در اختیار دوستان قرار دهم تا از آن استفاده نمایند ( یه دعایی هم به ما بکنن ) ، مجموعا 13 نکته در این تاپیک مطرح میشود که از بین حدود 30 نکته استخراج شده و سعی بر این بوده که نکات کاربردی تر مطرح شود ، امیدوارم من را در این راه یاری بفرمایید ، راستی فکر نکنید من زیاد تخصصی هستم ها ، فقط تا جایی که سوادم میرسیده ترجمه کردم ، اگه مشکلی در نکات میبینید تذکر بدین . اینم بگم که تمام این نکات رو هم که رعایت کنید آخرش باید اعلان اصل مهم فشرده سازی صفحات وب در ASP.Net 2 (http://barnamenevis.org/forum/showthread.php?t=55129) نوشته شده توسط آقای راد را با دقت مطالعه نمایید .

نکته اول : پرهیز از رفت و برگشت اضافی به سرور :

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

maxpayn2
شنبه 07 مهر 1386, 12:07 عصر
نکته دوم : پرهیز از نگهداری 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 نیز وجود دارد .

maxpayn2
شنبه 07 مهر 1386, 18:34 عصر
نکته سوم : Buffering را غیر فعال نکنید مگر اینکه دلیل خاصی برای غیر فعال کردن آن داشته باشید

نکته چهارم : برای انتقال به صفحات دیگر از متد Transfer متغلق به آبجکت Server استفاده نمایید ، البته باید به 2 نکته توجه کنید :

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

maxpayn2
یک شنبه 08 مهر 1386, 10:18 صبح
نکته پنجم : در صورت نیاز نداشتن به Session State آن را غیر فعال کنید چون همه به آن نیاز ندارند :




<%@ Page EnableSessionState="false" %>

اگر در صفحه ای نیاز به خواندن اطلاعات Session دارید ولی نمی خواهید آن را تغییر دهید یا پاک کنید میتوانید به صورت زیر عمل کنید :




<%@ Page EnableSessionState="ReadOnly" %>

اگر می خواهید Session State را در کل پروژه غیر فعال کنید می توانید در Web.config به صورت زیر عمل کنید :




<sessionState mode="Off" />

maxpayn2
یک شنبه 08 مهر 1386, 10:26 صبح
نکته ششم : برای ذخیره و بازیابی اطلاعات از SQL Server و Stored Procedure ها در آن استفاده نمایید .

الف - ساختن Stored Procedure :

CREATE PROSEDURE [insert_procedure]
( @id [int] , @name [varchar](50) , @family [varchar](50) )
AS INSERT INTO user
( [id[ , [name] , [family] )
VALUES
(@id , @name , @family)
GO

ب - استفاده از Stored Procedure :

C#






SqlConnection cnn = new SqlConnection();

cnn.ConnectionString = "Data Source=.;Database=test;Integrated Security=SSPI";

SqlCommand cmd = new SqlCommand("insert_procedure",cnn);

cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.AddWithValue("@id", Convert.ToInt32(TextBox1.Text));
cmd.Parameters.AddWithValue("@name", TextBox2.Text);
cmd.Parameters.AddWithValue("@family", TextBox3.Text);

cnn.Open();

cmd.ExecuteNonQuery();



cnn.Close();

VB

Dim cnn As SqlConnection = New SqlConnection
cnn.ConnectionString = "Data Source=.;Database=test;Integrated Security=SSPI"
Dim cmd As SqlCommand = New SqlCommand("insert_procedure", cnn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("@id", Convert.ToInt32(TextBox1.Text))
cmd.Parameters.AddWithValue("@name", TextBox2.Text)
cmd.Parameters.AddWithValue("@family", TextBox3.Text)
cnn.Open
cmd.ExecuteNonQuery
cnn.Close

maxpayn2
یک شنبه 08 مهر 1386, 12:01 عصر
نکته هفتم : برای خواندن اطلاعات از پایگاه داده از SqlDataReader استفاده نمایید که Performance بالاتری نسبت به DataSet به ارمغان می آورد .

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

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

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

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

maxpayn2
دوشنبه 09 مهر 1386, 11:37 صبح
نکته دوازدهم : تا جایی که ممکن است در کد نویسی از Exception ها استفاده نکنید ، به مثال زیر توجه کنید ، کد شماره 2 نسبت به 1 ارجهیت دارد :

C#




1 -

try
{
result = 100 / num;
}

catch (Exception e)
{
result = 0;
}

2 -

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


Visual Basic


1 -

try
result = 100 / num
catch (e as Exception)
result = 0
end try

2 -

if not (num = 0)
result = 100 / num
else result = 0
end if

maxpayn2
دوشنبه 09 مهر 1386, 14:36 عصر
نکته سیزدهم : صفحات پروژه خود را Precompile کنید ، برای این کار مراحل زیر را انجام دهید :

الف - یک پنجره Command باز کرده و به پوشه حاوی دات نت فریم ورک بروید :





windir%\Microsoft.NET\Framework\version




ب - asp_compiler را اجرا کنید :





aspnet_compiler -v /virtualPath




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





aspnet_compiler -p physicalOrRelativePath -v /




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

یک فیلم آموزشی در این زمینه (http://www.ASP.NET/learn/videos/video-447.aspx)

maxpayn2
دوشنبه 09 مهر 1386, 14:40 عصر
نکات تموم شد ، امیدوارم که خوب بوده باشه و به دردتون بخوره ، البته نکات دیگری هم بود که زیاد کاربردی نبودند و خیلی در Performance تاثیری نداشتند
التماس دعا

maxpayn2
چهارشنبه 18 آذر 1388, 14:32 عصر
به نکته سیزدهم یک لینک اضافه کردم که حاوی فیلم آموزشی از سایت www.asp.net متعلق به مایکروسافت هستش

maxpayn2
چهارشنبه 05 آبان 1389, 12:04 عصر
تصمیم گرفتم از این به بعد نکاتی رو که در طی برنامه نویسی (تجربه) بهشون رسیدم و نکاتی رو که از اساتید یاد گرفتم اینجا بنویسم ، شماره نکات رو ادامه میدم ولی دقت کنید این نکات مربوط به اون مقاله نیستند . لطفا برای حفظ یکپارچگی تاپیک اگه در مورد نکات سوال دارید در تاپیک ها جدید مطرح بفرمایید تا در موردشون بحث بشه . اگه نکاتی هم به نظرتون میرسه پیغام خصوصی بدین اضافه کنم .

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

mohammadi4net
چهارشنبه 05 آبان 1389, 12:19 عصر
نکته چهاردهم : برید AJAX واقعی رو یاد بگیرید و هی از AJAX ویژوال استودیو (Update Panel) و این کامپوننت های آماده استفاده نکنید

تایید میشه چون خودم به این نتیجه رسیدم که باید css و ajax رو به بهترین نحو ممکن یاد بگیرم. بهتره این نکته رو اینجوری بنویسد:

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

aserfg
چهارشنبه 05 آبان 1389, 14:30 عصر
نکته چهاردهم : اگر می خواهید یک برنامه نویس واقعی وب باشید برید AJAX واقعی رو یاد بگیرید و هی از AJAX ویژوال استودیو (Update Panel) و این کامپوننت های آماده استفاده نکنید
دوست عزیز شما با اونچه که ایجکس واقعی می خونید تنها می تونید متن و xml رو برگردونید .درسته که بسیار کارامد هست از حیث سرعت ولی گاها پیاده سازی کاری که یه update panel به سادگی انجام می ده کاری طاقت فرسا و گاه غیر ممکنه . (حداقل برای برنامه نویسان سطح مبتدی و متوسط) .
من این رو به جمله شما اضافه می کنم : یاد بگیریم چگونه و چه موقع از update panel استفاده کنیم .

maxpayn2
چهارشنبه 05 آبان 1389, 14:45 عصر
همونطور که گفتم لطفا برای حفظ یکپارچگی تاپیک اگه در مورد نکات سوال یا مطلبی دارید در تاپیک های جدید مطرح بفرمایید تا در موردشون بحث بشه . اگه نکاتی هم به نظرتون میرسه پیغام خصوصی بدین اضافه کنم . یادآور میشم از نکته 14 به بعد نکات تجربی هستند و اینطوری نیست که "همین است ولا غیر"

maxpayn2
چهارشنبه 05 آبان 1389, 16:13 عصر
نکته پانزدهم : حذف کردن 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>

منبع : www.ASP.NET (http://www.ASP.NET)

majnun
چهارشنبه 05 آبان 1389, 20:55 عصر
من برای نگهداری این مقاله درون سیستمم اونو تبدیل به pdf کردم

شما هم دوست داشتین دانلودش کنید...

maxpayn2
شنبه 08 آبان 1389, 11:12 صبح
از لطف و توجه دوستان سپاسگذارم

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

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




<configuration>
<system.web>
<deployment retail=”true”/>
</system.web>
</configuration>

maxpayn2
شنبه 08 آبان 1389, 17:27 عصر
نکته هفدهم : وقتی کار برنامه نویسی تمام شد tracing را غیر فعال کنید ، برای این کار در web.Config :




<configuration>
<system.web>
<trace enabled="false" />
</system.web>
</configuration>

maxpayn2
یک شنبه 09 آبان 1389, 09:49 صبح
نکته هجدهم : هر جا که میتوانید از اعتبار سنجی سمت سرور (Server-Side validation) پرهیز کنید و اگر در مواردی به مرورگر کاربر اعتماد ندارید باز هم از اعتبار سنجی سمت کلاینت استفاده کرده و هنگام دریافت اطلاعات از Page.IsValid بهره ببرید .

بنابر راهنمایی جناب mehdi.mousavi (http://www.barnamenevis.org/forum/member.php?u=41233) و با تشکر از آقای علیرضا صالحی این نکته بدین صورت تصحیح میشود :

علاوه بر Server-Side Validation، بهتر است تا از Client-Side Validation برای پرهیز از Round-Trip های اضافی بین Client و Server استفاده شود.

maxpayn2
سه شنبه 11 آبان 1389, 10:55 صبح
نکته نوزدهم : هیچوقت از Page.DataBind استفاده نکنید چون باعت بایند شدن تمام کنترل هایی که Binding را ساپورت میکنند میشود در صورتی که شما مثلا میخواهید فقط یک گرید یا یک ریپیتر بایند شود

maxpayn2
چهارشنبه 12 آبان 1389, 10:19 صبح
نکته بیستم : در تعداد رکورد بالا از Data Paging / Sorting استفاده کنید . فرض کنید 5000 رکورد دارید و در هر صفحه از گرید 100 رکورد را نشان می دهید . در هر صفحه 4900 رکورد باقیمانده نشان داده نمیشوند که حافظه بالایی را مصرف میکنند .

maxpayn2
چهارشنبه 12 آبان 1389, 16:13 عصر
نکته بیست و یکم : برای مقادیر عددی (String) به جای For از Foreach استفاده کنید

maxpayn2
پنج شنبه 13 آبان 1389, 10:26 صبح
نکته بیست و دوم : بعد از try catch از finally استفاده نمایید تا مطمئن شوید که ارتباط با منابع (مثلا دیتابیس) حتما قطع شود .

maxpayn2
پنج شنبه 13 آبان 1389, 16:40 عصر
نکته بیست و سوم : در کد نویسی دقت زیادی به خرج بدید و سعی کنید کد بهینه بنویسید ، البته این نکته خیلی کلیه ولی یه مثال :

به جای x = x + 1 بنویسید x+ = 1

naser2009
پنج شنبه 13 آبان 1389, 21:13 عصر
نکته بیستم : در تعداد رکورد بالا از Data Paging / Sorting استفاده کنید . فرض کنید 5000 رکورد دارید و در هر صفحه از گرید 100 رکورد را نشان می دهید . در هر صفحه 4900 رکورد باقیمانده نشان داده نمیشوند که حافظه بالایی را مصرف میکنند .
در این حالت پیشنهاد میشه از Server Side Paging در stored procedure با استفاده از
ROW_NUMBER()
استفاده کنید.

maxpayn2
شنبه 15 آبان 1389, 10:49 صبح
نکته بیست و چهارم : کد های css ، javascript ، jquery و ... را در فایل های جداگانه بنویسید و از آن ها به صورت inline در صفحات aspx استفاده نکنید

maxpayn2
شنبه 15 آبان 1389, 13:02 عصر
نکته بیست و پنجم : وقتی میخواهید مقدار یک متغیر از نوع string را خالی کنید به جای "" = strText1 یا " " = strText1 از strText1=string.Empty استفاده کنید

maxpayn2
شنبه 15 آبان 1389, 15:35 عصر
نکته بیست و ششم : فقط در صفحاتی مانند ورود به سایت ، رجیستر ، دریافت اطلاعات حساب بانکی و ... که واقعا به SSL نیاز دارند از آن استفاده کنید .

یاسر مددیان
یک شنبه 16 آبان 1389, 09:40 صبح
نکته های بدرد بخوریه. امیدوارم ادامه دار باشه.

با تشکر

maxpayn2
یک شنبه 16 آبان 1389, 10:12 صبح
نکته بیست و هفتم : اگر فقط قصد نمایش ساده اطلاعات رو دارید از Repeater به جای گرید و ... استفاده کنید ، چون ریپیتر مختص نمایش است و نیاز به انجام پروسه هایی برای ویرایش ، حذف ، صفحه بندی و ... ندارد .

راهنمایی جناب mehdi.mousavi (http://www.barnamenevis.org/forum/member.php?u=41233) و جناب Behrouz_Rad (http://www.barnamenevis.org/forum/member.php?u=7945) : از اونجاییکه Repeater هیچ Feature اضافی ای نداره (مثل Selection، Sorting و Editing) به همین دلیل سریعتر در نظر گرفته میشه، اما واقعیت اینه که فاکتور تعیین کننده Performance در کلیه این کنترلها، نحوه استفاده از اونها و میزان ViewState تولید شده توسط هر یک هستش. در شرایط مساوی، Repeater بدلیل نداشتن تواناییهای ویژه، سبک ترین کنترل در بین این کنترلها در نظر گرفته میشه و البته جای خودش رو به ListView در نسخه های بعدی داده. ListView تواناییهای Repeater رو داره، اما سبک تر از GridView هستش

maxpayn2
یک شنبه 16 آبان 1389, 14:40 عصر
نکته بیست و هشتم : برای انجام عملیات چند مرحله ای و سنگین از Response.IsClientConnected استفاده کنید .

http://msdn.microsoft.com/en-us/library/system.web.httpresponse.isclientconnected.aspx

maxpayn2
دوشنبه 17 آبان 1389, 11:14 صبح
نکته بیست و نهم : اگر کنترلی در صفحه دارید که در شرایطی باعث PostBack می شود حتما در Page_Load از Page.IsPostBack استفاده کنید .




void Page_Load ( Object sender, EventArgs e )
{
if (!Page.IsPostBack)
{
//Your codes
}
}

maxpayn2
دوشنبه 17 آبان 1389, 16:37 عصر
نکته سی ام : برای الحاق کردن مقادیر رشته ای (string) از StringBuilder استفاده کنید . برای روشن شدن موضوع به یک مثال توجه فرمایید :




Response.Write("<b>String Class</b>")
Dim str As String = ""
Dim startTime As DateTime = DateTime.Now
Response.Write(("<br>Start time:" + startTime.ToString()))
Dim i As Integer
For i = 0 To 99999
str += i.ToString()
Next i
Dim EndTime As DateTime = DateTime.Now
Response.Write(("<br>End time:" + EndTime.ToString()))
Response.Write(("<br># of time Concatenated: " + i.ToString))Start time: 2/15/2010 10:21:24 AM
End time: 2/15/2010 10:25:47 AM
# of time Concatenated: 100000




Response.Write("<b>StringBuilder Class</b>")
Dim strbuilder As New StringBuilder()
Dim startTime As DateTime = DateTime.Now
Response.Write(("<br>Start time:" + startTime.ToString()))
Dim i As Integer
For i = 0 To 99999
strbuilder.Append(i.ToString())
Next i
Dim EndTime As DateTime = DateTime.Now
Response.Write(("<br>Stop time:" + EndTime.ToString()))
Response.Write(("<br># of time Concatenated: " + i.ToString))Start time: 2/15/2010 10:31:22 AM
Stop time:2/15/2010 10:31:22 AM
# of time Concatenated: 100000


در شرایط مساوی با استفاده از کلاس String عملیات مورد نظر 4 دقیقه و 23 ثانیه طول کشید و با استفاده از StringBuilderکمتر از یک ثانیه

maxpayn2
سه شنبه 18 آبان 1389, 10:12 صبح
نکته سی و یکم : در دیتابیس بهترین و کوچکترین نوع داده (Data type) رو برای هر Column انتخاب کنید ، مثلا برای مقادیر تاریخ از varchar یا ... استفاده نکنید .

maxpayn2
سه شنبه 18 آبان 1389, 12:38 عصر
نکته سی و دوم : سعی تا حد امکان در دیتابیس از کلید های خارجی Null پذیر استفاده نکنید تا تعداد outer join ها محدود شود . چون outer join ها منابع بیشتری از سیستم نسبت به inner joins ها مصرف می کنند و باعث پایین آمدن Performance میشوند .

منبع : msdn.microsoft.com (http://msdn.microsoft.com)

maxpayn2
چهارشنبه 19 آبان 1389, 09:38 صبح
نکته سی و سوم : در دیتابیس برای column هایی که مقادیر رشته ای کمتر از 8000 کاراکتر را در خود ذخیره می کنند از varchar استفاده کنید نه از text

منبع : msdn.microsoft.com
(http://msdn.microsoft.com/)

maxpayn2
چهارشنبه 19 آبان 1389, 13:13 عصر
نکته سی و چهارم : فقط سطر و ستون های مورد نیاز را select کنید و حتی الامکان از Select * from table استفاده نکنید

منبع : msdn.microsoft.com
(http://msdn.microsoft.com)

maxpayn2
شنبه 22 آبان 1389, 11:40 صبح
نکته سی و پنجم : از SQL Profiler برای تشخیص query هایی که زمان زیادی برای اجرا لازم دارند ، استفاده کنید .

maxpayn2
یک شنبه 21 اسفند 1390, 16:59 عصر
نکته غیر مرتبط : با استفاده از Entity Framework پروژه زودتر تموم میشه ، یا بهتره بگم Performance کد نویسی بیشتر میشه !

Ehsan Boorboor
یک شنبه 21 اسفند 1390, 17:15 عصر
یک پیشنهاد داشتم اگر می تونید در اولین فرصت تمام نکات رو در قالب یک مقاله ویرایش و بروزرسانی کنید.