بهینه سازی عملکرد ASP.NET

پنجشنبه 22 مهر 1395

عملکرد یک برنامه از دیدگاه کاربر بسیار مهم است و اگر به هر دلیلی این عملکرد از معیارهای استاندارد در زمینه هایی مانند فراخوانی های سرور،ajax و یا منابع کاهش پیدا کند، کاربر نهایی چاره ای جز رها کردن آن برنامه نخواهد داشت. بنابراین برای حل این مشکل، شما باید به دنبال راه حل هایی برای افزایش عملکرد نرم افزار خود با استفاده از تقویت کننده ها باشید که ما در این مقاله به آن خواهیم پرداخت.

بهینه سازی عملکرد ASP.NET

عملکرد یک برنامه کاربردی، مهمترین جنبه ای است که شما باید هرروز آن را بررسی کنید و تلاش کنید با به کارگیری روش های بهترو بهینه تر، آن را بهبود ببخشید.

اما چه روش هایی برای قضاوت در مورد اینکه  چگونه میخواهید بهینه سازی سایت خود را انجام دهید وجود دارد؟

در زیر لیست معیار های بهینه سازی عملکرد  که شما میتوانید بر اساس آن ها قضاوت مناسب انجام دهید را میبینید:

1. سرعت

2.  استفاده از گزارش ها

3. . Exception Handlin مناسب

4. View State

5. استفاده مناسب از Caching

6. دوری کردن از اعتبار سنجی سمت سرور 

7. کوچک کردن و فشرده سازی منابع JS، CSS 

8. مدیریت Session 

9.  استفاده از Paging برای نتیجه های زیاد و  بزرگ

10. دوری از حلقه های بی نهایت (RoundTrips ) غیر ضروری در سرور

11. صفحه ها به صورت دسته ای کامپایل شوند.

12. قسمت بندی نرم افزاز به صورت منطقی 

13.  فشرده سازی HTTP 

14. مدیریت منابع 

15. String Handling

حال ما میتوایم به صورت جداگانه روی هر کدام از آنها بحث کنیم.

سرعت :

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

کاهش حجم صفحه :

کاهش حجم صفحه  یعنی استفاده از فایل های خارجی css و javascriptبه جای فایل های inline  css و javascript.

روش دیگر کاهش حجم صفحه استفاده از نسخه کوچک شده javascript و همچنین استفاده از css و js برای زیبایی صفحه به صورت آنلاین میباشد.

زیباسازی به معنای فرمت دهی به فایل های بدون فرمت( با فاصله،با توضیحات و بدون تو رفتگی) می باشد.

کوچک سازی یعنی حذف کردن فاصله ها،توضیحات،متن های بدون شماره و اندیس وهمچنین استفاده از ویژگی های خوبی که باعث کاهش فضا میشود مثل استفاده از نام های کوتاه  برای متد ها و متغییر ها و نوشتن تمامی کدها در یک خط . مانند رو به رو :

function a(b){ if b == '4'){ b='good'}}.

یکی از موثر ترین راه ها برای جدا کردن منطق برنامه ، جداسازی منطق data access و business layer ها است ،بنابراین در این سطح از برنامه  شما میتوانید آن ها را جداسازی کنید. این کار را به وسیله ساختن user control ای header, body و footer. باید انجام دهید.

کاهش تعداد درخواست ها(Requests) به سرور :

هنگامی که تعداد درخواست های کمتری به سرور برود صفحه شما به صورت موثرتری .خدمات میدهد

کاهش تعداد درخواست ها با استفاده از کاهش تعداد منابع، مثل نوشتن تمام کد های css در یک فایل جداگانه  و همچنین هوشمندسازی قطعه کدهای جاوا اسکریپت.

روش دیگر  نگه داشتن منابع غیر ایستا و حذف header های غیر ضرورری از درخواست است.مانند شماره نسخه برنامه و غیره.

استفاده از CDN (Content Delivery Network) که این مورد، فایل های مورد نیاز را از نزدیک ترین سرور موجود دانلود میکند و درخواست جاری را اگر دیگر وب سایت ها از  فایل های پلاگین جی کوئری یکسان استفاده کنند ذخیره میکند.*

استفاده از گزارش ها

از گزارش IIS برای دنبال کردن مسائل به صورت هفتگی یا ماهانه  برنامه کاربردی  تان(application) استفاده کنید، و بهتر آن است که به صورت روزانه آن را نگاه اندازید، عموما گزارشات iss شامل اطلاعات درمورد سرورتان، تاریخ و زمان span، صفحه ارجاع ،URL  اصلی و خیلی از اطلاعات دیگر و همچنین  کدهای پاسخ HTTP وضعیت که از طریق آن شما می توانید به ماهیت موضوع را درک کنید ، است.

روش دیگر سفارشی سازی مواردی است که می خواهید از آن ها گزارش تهیه کنید. برای این کار یک جدول در پایگاه داده و وارد کردن متن خطاها در آن است.

روش های خوب زیادی برای گزارش گیری خطاها وجود دارند.یکی از بهترین های ابزار های موجود، ابزار Elmah است. که دارای یک محیط پایه پیکربندی است که  از طریق آن شما می توانید به وسیله پیکربندی آن با گزینه ایمیل به شخص مسئول این را پیگیری کنید.

(Error Logging Modules and Handlers) ELMAH 

یک ابزار debugging متن باز برای ASP.NET web services است. وقتی که روی یک ماشین به  web application در حال اجرا اضافه میشود استثناها(exceptions) که در داخل گرداننده رویداtrigger د از ابزار ELMAHهستند پرتاب (thrown) میشوند.

 

Exception Handling مناسب :

توسعه دهندگان زیادی وجود دارند که نمیتوانند  تکنیک استثنا مناسب به عنوان یک نتیجه نهایی مدیریت کنند در نتیجه آنها خیلی راضی نیستند که ابن یعنی آنها نمی توانند درک کنند که یک کرش(Crash) در برنامه کاربردی موجود است.

بهترین روش استفاده از بلاک های try..... catch  برای مدیریت این استثناء ها است.

کاربر میتواند از (if statement) برای بررسی باز بودن ارتباط با پایگاه داده استفاده کند.

راه دیگر استفاده از (try.... catch block) است که اگر ارتباط با پایگاه داده بسته نشده بود یک exception پرتاب کند.

با try...catch این بهترین عملکرد برای استفاده از بلاک پایانی است و همچنین  با try...catch می توانیم شی های استفاده شده در هر محدوده را پس از پایان کار، از بین ببریم تا در استفاده از حافظه صرفه جویی کرده باشیم.

·   try    

·   {    

·   }    

·   catch (Exception)   

·   {    

·   throw;    

·   }    

·   finally    

·  {    

·   }

 

 

Exception handling یکی از مهمترین تکنولوژی ها برای پیدا کردن زمان اجرای استثنای مدیریت نشده اصلی در برنامه های کاربردی است اما این را باید عاقلانه و خردمندانه استفاده کرد.

View State :

View state یک  component رمزگذاری شده در webforms است که حفظ حالت صفحات است.

View state  برای حفظ حالت صفحه در هنگام post back ها استفاده میشود. این فیلد ها  مخفی هستند و شما میتوانید با  دیدن source صفحه آن ها را بررسی کنید. اگر شما از View State  های زیادی برای نگهداری داده ها در وب فرم استفاده کنید با مشکلاتی در زمینه ی راندمان و عملکرد سایت مواجه خواهید شد.

خب بهترین تمرین برای بازنویسی این نوع ها چیست؟

در اینجا برخی از الگو های عملکرد است که باید برای زمانی که از view stateاستفاده میکنیم به حساب آورده شوند.

از آن در هر زمان که در یک صفحه مورد احتیاج است استفاده کنید اما محدود به اندازه کوچک در حد امکان است.

•  از چند فرم داخل یک تک صفحه(single page) با داشتن مدیریت وضعیت فعال استفاده نکنید.

از این برای درخواست های عاقلانه روی یک صفحه یا رد سطح کنترل در سطح برنامه استفاده کنید.

بر سایز view stateبه واسطه فعال کردن trace نظارت کنید.

جلوگیری از ذخیره سازی اشیاء بزرگ از نظر اندازه به طور مستقیم در اشیاء متتناسب

 

استفاده مناسب از ذخیره سازی

با استفاده مناسب از ذخیره شما می توانید بسیاری از مزایای مانند کاهش رفت و آمد به سرور، کاهش تعداد منابع سرور و ارائه آن را سریع تر از حالت عادی معمول میکند. این می تواند عملکرد manyfold توسط ذخیره داده ها بر روی درخواست های HTTP متعدد را بهبود بخشد، می توانید صفحه تا حدی برای زمان مشخص با برخی از ارزش انقضا ذخیره کنید. این می تواند به عملکرد نرم افزار با ذخیره داده ها در حافظه به طوری که می توان آن را به سرعت با زمان کمتر درست مثل RAM پردازنده دیده را افزایش دهد. Cache می تواند در برنامه شما در دسترس قرار بگیرد تا سپس بتوانید از آن در webfarm نیز بهره بگیرید، زیرا در webfarm مدیریت های گسترده ای مانند memcached وجود دارند که می توانند برای به اشتراک گذاری داده ها در داخل webfarm استفاده شوند.

بهترین استفاده از کش به شرح زیر است:

از این در تمام لایه های DataAccess، Business  و UI  استفاده میکنیم. و ار این  استفاده میکنیم در یک روش مناسب که میتواند عملکرد را تقویت کند.

ذخیره سازی برای زمان های طولانی برای منابع ایستا یا منابعی که از آن زیاد استفاده میشود و همچنین اضافه کردن  انقضا به کش و همچنین گرفتن بهترین عملکرد انجام میدهیم.

• object های گران و با ارزش مثل connection و مانند دیگر منابع را در cache ذخیره نکنیم.

استفاده از خروجی کش برای صفحه های ایستا با تاریخ انقضا و مکان و هر چیزی که نیاز دارید.

از کش با قسمت های جزئی برای گرفتن محتوای صفحه به صورت تیکه تیکه استفاده میکنیم.

 

جلوگیری  از  Server Side Validation :

    اعتبار سنجی سیستم تان بخش مهمی است زیرا شما با استفاده از آن ، اطلاعات مورد نظرتان برای ذخیره در پایگاه داده را به وضوح مشخص میکنید. زیرا اگر شما input هایی با نوع های مختلف داشته باشید، احتمال این مورد وجود دارد که داده های مورد نیاز نتوانند به درستی دریافت شوند. به همین خاطر به اعتبار سنجی نیاز مندیم.

اعتبار سنجی ها 2 نوع هستند: سمت client و سمت سرور.

اعتبار سنجی سمت سرور  برای تامین امنیت اطلاعات حساس مانند ذخیره سازی رمز عبور و سایر اطلاعات حساس دیگر مهم هستند.

 اعتبار سنجی سرور شاید همیشه لازم نیست که انجام شود.زیرا همیشه در خواست و پاسخ به کلاینت برمیگردانند و ثبت میشوند. که باعث هزینه و وقت کاربر میشود.

این نوع از اعتبار سنجی وقتی که اثر آنها ثبت شد به وقوع میپیوندند.

بهترین نکته در مورد استفاده از آن ها این است که  وقتی که شما نیاز به  اطمینان پیدا کردن از امنیت دارید است در ما بقی موارد بهتر است که فرمت های اعتبار سنجی سمت کلاینت مثل email، URL ،شماره تلفن و دیگر اطلاعاتی که نیاز به بررسی دارند.

 

کوچک کردن و فشرده سازی  JS و :CSS 

بهترین عملکرد با محتوا های استاتیک مینیمم کردن یعنی کوچک کردن آن هاست. مانند Jquery که توصیه میشود که  از نسخه min.js  آم استفاده شود.برای عملکرد بهتر با سایر کتابخانه ها شما نیاز به include  کردن نسخه مینیمم آن ها در برنامه تان  دارید.  زمانی که از فایل های مینیمم شده استفاده می کنیم ، در زمان زیاد شدن درخواست ها به صفحه، زمان کمتری صرف بارگذاری صفحه خواهد شد. پس در iis نیز برای فشرده سازی متن های ایستا و پویا وجود دارد که شما میتوانید این را در وب سایت خود فعال کنید.

همچنین بهترین عملکرد این هست که برای استفاده از  css فایل ها در بالای صفحهwebpage زمانی که script باید includ شود در یک دکمه ی صفحه برای پردازش سریع صفحه.

همانطور که همه از آن آگاه هستید ما با استفاده از بسته نرم افزاری کتابخانه های  جاوا اسکریپت روز به روز کار ما را انجام میدهند اما ما درباره ی رفتار  و تاثیر که آن ها بر سیستم ما گذشته اند را فراموش کرده ایم.

برای غلبه بر این ماکروسافت چارچوب بهینه سازی وب سایت خود را که مفید نیز هم است معرفی کرد.

 

مدیریت Session

Session  یکی از مهمترین پارت های asp.net است اما اگر به درستی به کار گرفته نشوند اثرات آن نا مطلوب است.

در اینجا برخی از بهترین شیوه برای استفاده هوشمندانه از آن را بازگو میکنیم :

یک دسته از داد ه ها را در session ها ذخیره نکنید.           

فقط انواع داده ساده را ذخیره کنید نه داده هایی از نوع complex.

استفاده هوشمندانه از session state های موجود مانند نمونه های موجود در Proc، out of process با استفاده از state view و out of process با استفاده از SQL Server.

• out of process از بهترین گزینه ها  است چون این برنامه بر خلاف تغییرات پیکربندی همه ی برنامه ها ، restart  نمیشود، اما بدلیل چند سروری که در sql دارد کند است، در صورتی که برنامه های دیگر سریع تر هستند چون از یک حافظه یکسان  برای برنامه و بازیابی استفاده میکنند.

در session state از داده های حساس استفاده نکنید.

•  برای خروج کاربری با session فعال از حسابش ، همیشه از متد abandon ()  استفاده میکنیم.

صفحه بندی یرای مجموعه جواب های بزرگ

صفحه بندی روی  مجموعه جواب های بزرگ  رویکرد خیلی مفید هستند که ما رکورد ها را برای نمایش  در هر صفحه به 10 الی 30 رکورد محدود میکنیم و در فراخوانی برای بارگذاری  رکوردهای بعدی ،آن ها را لود کرده و نمایش می دهیم . این کار، فشار مربوط به بارگذاری داده های اضافی را کاهش می دهد و به این ترتیب باعث افزایش سرعت بارگذاری صفحه می شود. بنابراین بهترین روش این است که نتایج را تا حد ممکن دسته بندی کنیم و از ROWCOUNT()  استفاده کنیم که عملکرد روش صفحه بندی را به میزان زیادی افزایش می دهد.

client شما منابع کمی در اختیار دارد همچنین نتایج با حجم زیاد را ذخیره میکند که این برای client تاثیر بسزایی دارد.

کلیدی ترین نکته در paging استفاده از تایع رده بندی برای شماره ردیف هاست.

اگر شما میتوانید همه ی رکورد ها را در برابر رکورد های صفحه اول با زمان بررسی کنید شما نمایش خوبی داشته اید.

دوری از Roundtrips  های غیر ضروری در سرور :

بهترین روش برای دوری از Roundtrips  های غیر ضروری در سرور این است که مطمئن شویم که فراخوانی های غیر ضروری به سرور نداریم . شماره درخواست های ارسالی به سرور زمان لود شدن صفحه را افزایش میدهد در نتیجه کلاینت در فشار قرار میگیرد.

بنابراین این لازم است که شما باید از مکانیزم client برای اطمینان از اعتبار دریافت data از سرور که این نتیجه عملیات post back نباشد استفاده کنید و هیچ سرور callback  درگیر نشده است که نتیجه در سرور درگیر میشود و  چرخه درخواست پاسخ شروع میشود.*

شما میتوانید بین web server و مرور گر round trips کمتری ایجاد کنیم.

برای برگشتن به صفحه اصلی از Server.Transfer به جای Response.Redirect استفاده میکنیم.

حوزه Server.Transfer در برنامه حاضر است.

اگر داده شما ایستا است شما میتوانید از caching برای عملکرد بهتر استفاده کنید. از خروجی buffering برای کاهش roundtrips توسط load کل صفحه استفاده کنید. اگر شما قصد انتقال داده هایی دارید و client شما همیشه متصل است میتوانید از HttpResponse.IsClientConnected برای کاهش احتمال نرسیدن دیتا استفاده کنید.

صفحه ها باید به صورت دسته ای کامپایل شوند

بیشتر assembly ها در یک فرآیند رشد میکنند ، و احتمال خارج شدن از برنامه و مواجه شدن با خطای کمبود حافظه بیشتر می‌شود . برای غلبه بر این صفحات ، در آغاز درخواست از یک صفحه ، تمام صفحاتی که در یک دایرکتوری قرار دارند ، کامپایل شده و همه ی آنها در یک فایل Assembly قرار می‌گیرند . ساده ترین مزیت آن این است که به جای آن که چندین فایل  Assembly لود شود ، یک فایل Assembly  لود میشود.

شما همچنین میتوانید از چند چیز هنگام این کار اطمینان پیدا کنید :

• debug کردن property در پیکربندی فایل همیشه false قرار میگیرد در محیط کالا که اگر آن true شود صفحه ها به صورت دسته ای کامپایل نمیشوند.

صفحه ها time out  را انجام نمیدهند اگر web service  صفحه، پاسخی در زمان دلخواه ندهند.

اطمینان حاصل کنید که از چند زبان در یک diredctory استفاده نکنیدکه این کار باعث کاهش احتمال کامپایل شدن دسته ای صفحه ای میشود.

تقسیم بندی ی برنامه به صورت منطقی :

این یعنی تقسیم بندی منطقی برنامه مثل لایه های business ،presentation و Data access.

این موضوع که شما بتوانید هر اتفاقی که در لایه های مربوطه می افتد را کنترل کنید بسیار مفید است.

البته این به این معنی نیست که شما باید کد های بیشتری  بنویسید . کد مناسب با قابلیت استفاده مجدد و مقیاس پذیری یکی از خصوصیت های کلیدی برنامه تان است.

این جدا سازی را با جدا سازی فیزیکی اشتباه نگیرید در این جا فقط کد های منطقی از هم جدا میشوند.

در زیر نکات کلیدی جداسازی منطق برنامه را آورده ایم:

 • مزیت اصلی آن این است که شما یک انتخاب برای جداسازی روی سرور برای سهولت در یک محیط وب اما این تاخیر را افزایش میدهد*

لایه های منطقی اثر خوبی بر برنامه شما میگذارند. برای مثال تمام فایل های منطقی در پوشه bin هستند.

 

فشرده سازی HTTP :

فشرده سازی HTTP یعنی فشرده سازی  محتوا به  فرمت Gzip  یا جلوگیری از زیاد شدن حجم و ارسال با محتوای header ها بعد از تایید شدن فشرده سازی. این کار زمان انتقال بین  IIS  و browser را بالا میبرد.

دو نوع از فشرده سازی که در IIS پشتیبانی میشود :

فشرده سازی ایستا (Static )

این فشرده سازی به وسیله ی مسیر دایرکتوری  attribute محتوا های ایستا را کش میکند.

بعد از اولین درخواست که فشرده شده است و پس از درخواست  از کپی کش فشرده شده استفاده میکند بنابراین زمان را کاهش میدهد و عملکرد برنامه را افزایش میدهد.

شما باید فقط یک محتوای ایستا را فشرده سازی کنید که یک بار هم به محتوای پویا تغییر نکند.

 

فشرده سازی پویا :

 برخلاف محتواهای ایستا، محتوای پویا  اغلب تغییر میکنند که در نتیجه قابلیت فشرده سازی را نه از طریق اضافه شدن به catch بلکه از طریق ذخیره سازی محتویات پشتیبانی میکند

 

مدیریت منابع :

مدیریت منابع یعنی مدیریت همه ی منابع برنامه تان که مستقیما روی عملکرد برنامه تان تاثیر دارد.مدیریت ضعیف منابع باعث کاهش عمکرد برنامه میشود و بار اضافی روی cpu سرور شما قرار میدهد.  

در زیر لیستی از تکنیک های مفید برای مدیریت منابع را میبینیم:

• استفاده مناسب از  pooling

• استفاده مناسب از شی Connection

 Dispose کردن منابعی فعلا از آن ها استفاده نمیکنید.

مدیریت    memory leaks

حذف متغیرهایی استفاده نمیشوند.

 

String Handling

مدیریت String  یکی از کلید های مدیریت حافظه در برنامه تان است.

 

بسیاری از تکنیک های هستند که برای رسیدگی به strings ها مثمر ثمر هستند، که بعضی از آن ها در زیر نام برده شده است :

استفاده از ()Response.Write خروجی را در بروزر سریع تر نمایش میدهد.

استفاده از  stringBuilder وقتی که تعداد concatenate strings ها نمیدانیم.

استفاده از  += operator برای string های زنجیره ای وقتی که تعداد string ها محدود است و شما تعدادشان را میدانید.

•  از .()ToLower استفاده نکنید زمانی که string را مقایسه میکنید؛  به جای استفاده از string.compare  برای مقایسه دو رشته ، یک رشته موقتی میسازد ، چون ، بوسیله کلاس CultureInfo ، برای داده های غیر حساس ، یک بررسی کننده میسازد .

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید