بهبود عملکرد نرم افزارهای تحت وب

دوشنبه 11 خرداد 1394

در این مقاله ما نحوه عملکرد web Application را در نرم افزاز های »وجود در Asp.Net مورد بررسی قرار می دهیم ، همچنین به نکاتی برای بهبود کارایی (performance) نرم افزار خود اشاره خواهیم کرد

بهبود عملکرد نرم افزارهای تحت وب

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

اکنون ، اگر به مشکل نرم افزار پی ببریم ، یک گام به رفع آن نزدیک می شویم .

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

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

هنگامی که شما یک نرم افزار ایجاد می کنید به صورت پیش فرض خاصیت set Debug در حالت "True" در web.config میباشد ، در هنگام انتشار نرم افزار خود همیشه آن را به حالت "false" قرار دهید .برای تنظیم این خاصیت به وضعیت "True" به اطلاعات pdb احتیاج داریم که بتوانیم آنها را در فایل ذخیره کنیم که در نتیجه حجم فایل افزایش میابد و از این رو سرعت فرایند کاهش می آبد .

غیر فعال کردن Trace (ردیابی) تا زمانی که مورد نیاز باشد

ردیابی نرم افزار شما را قادر می سازد که عملیات نرم افزار را رد یابی نمایید , هنگامی که این قسمت فعال باشد , اطلاعات بیشتر را به صفحه اضافه می کند .اغلب این قسمت در حالت غیر فعال (false ) میباشد .در صورتی که برنامه نویس بخواهد که به نحوه عملکرد نرم افزار نظارت کند , می تواند این قسمت را فعال نماید .

<trace enabled="false" requestLimit=”10” pageoutput=”false” traceMode=”SortByTime” localOnly=”true”> 

انتخاب وظعیت Session باید به دقت انجام شود

یک امکان فوق العاده در Asp.Net که قابلیت امکان ذخیره کردن اطلاعات Session را در سمت کاربر فراهم می کند ، هنگامی که Asp.Net تنظیمات Session را به صورت پیش فرض انجام می دهد ، کاربران مقداری از حافظه خود را از دست می دهند ، حتی اگر از آن استفاده نکنند ، گاهی اوقات ممکن است که شما به ذخیره اطلاعات session احتیاج نداشته باشید ، به عنوان مثال ممکن است اطلاعات صفحه ثابت باشد که در اینصورت احتیاج به ذخیره سازی این اطلاعات نمی باشد ، برای غیر فعال کردن ذخیره اطلاعات در Session از دستورات زیر استفاده می کنیم .

    <@%Page EnableSessionState="false"%>   

در این حالت فقط شما می توانید اطلاعات را برای بازیابی استفاده کنید و امکان بروز رسانی آن اطلاعات وجود ندارد ، همچنین می توانیم این اطلاعات را به فقط خواندنی(read-only) تبدیل کنیم ،

    <@%Page EnableSessionState ="ReadOnly"%>   

اگر نرم افزار به session mode احتیاج داشته باشد ، باید در انتخاب وضعیت   session mode دقت نماییم ، حالت Sql Server Session عملکرد (performance) کمتری نسبت به حالت server mode دارد .

شایان ذکر است از آنجایی که session state برای ذخیره مقادیر خود از serializing و de-serializing استفاده می کند ، پس هیچگونه احتیاجی به ذخیره آن در مقادیری با نوع داده های(data type) متفاوت نمی باشد .

همچنین برای انتقال اطلاعات از یک صفحه به صفحه دیگر میتوانیم از تکنیک مدیریت session state در سمت کاربر(مانند ارسال queryString ) استفاده نماییم ،

استقرار نرم افزار توسط Release Build

در زمان انتشار وب سایت یا نرم افزار خود در معرض عموم مطمئن شوید که نرم افزار در حالت Release Build قرار دارد و در حالت Debug Build نباشد ، اگر شما فکر میکنید که تفاوت چندانی در این دو حالت نمی باشد ، می توانید نرم افزار را در حالت Degub Build اجرا نمایید و شاهد کاهش عملکرد نرم افزار باشید که اگر در حالت Release Build باشد ، بهبود سرعت عملکرد را می توانید مشاهده نمایید .

غیر فعال کردن View State در نرم افزار در صورت امکان

View State یک تکنیک در Asp.net می باشد که میتوان اطلاعات را در فیلدهای مخفی در صفحه جاری ذخیره نمایید .هنگامی که صفحه اطلاعات را به سمت سرور ارسال می نماید و مجدد اجرا میشود (Post Back) ، سرور می تواند این اطلاعات را تجزیه کند ، اعتبارسنجی کند و به درخواست View State پاسخ دهد .

View State شامل قابلیت قدرتمندی می باشد که اطلاعات را در سمت کاربر ذخیره می کند و احتیاجی به ثبت این اطلاعات در Cookie یا هر حافظه دیگری در سمت سرور نمی باشد .

View State نیز شامل چندید نقض میباشد ، اما در هرصورت در افزایش سرعت بارگزاری اطلاعات در صفحه تاثیر بسزایی دارد .View State نیز با Serilizing و deserializing کردن اطلاعات متحمل بار اضافی میشود که در نتیجه مقداری از حافظه در سمت سرور اشغال می نماید .اغلب کنترل های سمت سرور مانند کنترل GridView تمایل زیادی به استفاده از View State دارند ، حتی اگر احتیاجی به استفاده از View State نباشد .در هر قسمت که نیاز به استفاده از View State نباشد ، صفحات هیچ ارسال اطلاعاتی به سمت سرور نداشته باشند ، ما میتوانیم View State را غیر فعال نماییم .

View State نیز مانند Session در حالت پیض فرض فعال میباشد .اما اگر به آن احتیاجی ندارید می توانید آنرا غیر فعال نمایید ، در ادامه تگ غیر فعال کردن View State را میتوانید مشاهده نمایید :

    <%@ Page EnableViewState="false" %>

جلوگیری از Response.Redirect

برای هدایت کاربران به صفحات مختلف در سمت کاربر می توانیم از متد Response.Redirect استفاده نماییم و آدرس صفحه را در این متد  قرار دهیم .سرور نیز پاسخ به نیاز کاربر را به مرورگر ارسال میکند .که این عمل یک سفر نسبتا طولانی برای ارسال دستورات به سمت سرور و دریافت آن میباشد که در عملکرد و سرعت پاسخدهی نرم افزار نیز تاثیر دارد .ما میتوانیم اطلاعات را توسط QueryString ارسال نماییم که در ارسال اطلاعات در Query String نیز محدودیت طول رشته داریم .در نتیجه ما نمی توانیم برای ارسال مقادیر با حجم زیاد از Query String استفاده کنیم .برای هدایت سمت سرور ، می توانیم از Server.Transfer استفاده کنیم .هنگامی که عملیات انتقال به سمت سرور انجام پذیرفت ، برای هدایت کاربر یه صفحه ای دیگر احتیاج به استفاده از Server.Tramsfer نمی باشد .در Server.Transfer با استفاده از HTTPContext ما می توانیم به مقادیر صفحه (Source Page) دسترسی داشته باشیم .

استفاده از StringBuilder برای رشته های زنجیره ای

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

از Exception  استفاده نکنید

کاهش سرعت نرم افزار در استفاده از exception مانند نرم افزار های تحت ویندوز قابل مشاهده نیست .شما میتوانید از تعدادی بلوکهای Try/Catch استفاده نمایید .استفاده بی جهت از exception باعث از دست دادن سرعت عملکرد نرم افزار (performance) می شود .به عنوان مثال شما باید در استفاده از exeption و control flow پرهیز کنید .

استفاده از متدهای نهایی

متد نهایی که از بلوکهای دستورات در نرم افزار به صورت جداگانه اجرا میشود .همیشه از یک متد نهایی برای بستن اتصال به بانک اطلاعاتی استفاده نمایید .بستن فایل ها و دیگر منابع نیز باعث آزاد شدن مقداری از حافظه در سمت سرور میشود که در نهایت سرعت عملکرد نرم افزار (performance)را افزایش میدهد .

از اسکریپت های اعتبارسنجی سمت کاربر استفاده نمایید

مقادیر وارد شده توسط کاربر می تواند بسیار خطرناک باشد و باید این مقادیر را اعتبار سنحی کنیم .اعتبار سنجی سمت کاربر می تواند حجم ترافیک سمت سرور را کاهش دهد که در نتیجه سرعت عملکرد نرم افزار را افزایش می دهد .در Asp.Net شما میتوانید از کنترل های سمت کاربر برای اعتبارسنجی مقادیر ورودی استفاده کنید ، با این حال برای مطمئن شدن از جلوگیری دستورات مخرب میتوانید از اعتبارسنجی های سمت سرور نیز استفاده نمایید .

جلوگیری از انتقال دستورات غیر ضروری

انتقال دستورات به سمت سرور یا به اصطلاح ترافیک سمت سرور به طور مستقیم بر روی سرعت عملکرد نرم افزار تاثیر دارد .بسیاری از نرم افزار ها شامل  حجم زیادی از درخواست های کاربر به سمت سرور می باشند .از آنجایی که اتصال به بانک برای کاربران تقسیم شده است , حجم ترافیک در سمت سرور افزایش میابد , که پاسخ سرور و نمایش اطلاعات در سمت کاربر با کاهش سرعت مواجه میشود .پس باید این نکته را همیشه در نظر داشته باشیم که همیشه این درخواستها را به حداقل برسانیم .

از دستور page.ispostback استفاده کنید

مطمئن شوید که دستورات غیر ضروری را اجرا نمی کنید .از page.ispotback استفاده نمایید که در اینصورت از دستورات راه اندازی و اجرای صفحه اطمینان حاصل می شود و به سمت کاربر  postback نمی شود .

از دستورات return در توابع و متدها استفاده کنید

روشن است که استفاده از Return ما را قادر میسازد که در JIT اجرای بهتری داشته باشیم .بدون استفاده از return ،بدون استفاده از Return ، هر تابع/متد چندین متغیر محلی در پشته برای حمایت از مقادیر Return بدون کلمه کلیدی داده شده است .حذف این دستور باعث عملکرد سخت تر JIT برای بهبود سرعت عملکرد نرم افزار میشود که در نتیجه میتوانیم کارایی آنرا در کد های خود مشاهده کنیم .پس در متد یا توابعی که به آنها نیاز داریم می توانیم از این دستورات استفاده کنیم .

از حلقه Foreach به جای دستور For استفاده کنید

دستور foreach یکی از دستورات رایج و پر کاربرد میباشد که در آینده از نظر کارایی به سرعت دستور For میرسد .این دستور در برخی موارد کاربرد مفیدی دارد , از جمله می توان آن را در متغیر هایی ار نوع رشته استفاده کنیم .اما شما همیشه به آن احتیاج ندارید .

از مجموعه مقادیر مناسب استفاده نمایید

مجموعه مقادیر صحیح را انتخاب نمایید ، به عنوان مثال اگر لیست آرایه (Array List) از خود آرایه بهتر است ، زیرا لیست آرایه (Array List) علاوه بر اینکه تمام جزئیات آرایه را دارد , همچنین شامل سایز بندی خودکار میباشد .در تمام متد های افزودن ، حذف ، ویرایش قابل استفاده است .در ادامه جدولی از مجموعه عملکرد که در بهبود عملکرد نرم افزار موثر میباشد را میتوانید مشاهده نمایید .

نکته :در صورتی که از کنترلهای اعتبارسنجی استفاده میکنید ، همیشه از دستور Page.IsValid استفاده نمایید .

استفاده از صفحه بندی (paging) در کنترل GridView :

اکثر نرم افزارهای تحت وب میبایست اطلاعات را به صورت بخش بندی نمایش دهند ، برای این امر ما به کنترل هایی از قبیل DataGrid،JQgrid,Telerik grid,Kendo Grid UI واز این قبیل احتیج داریم .انتخاب یک کنترل سبک حتی در عملکرد نرم افزار تاثیر بسزایی دارد .کنترل GridView مربوط به Asp.Net که در سمت سرور استفاده میشود , باعث میشود که سرعت عملکرد نرم افزار کاهش پیدا کند و در نتیجه حجم ترافیک سمت سرور افزایش میابد ، از آنجا که JQGrid نسبت به کنترل GridView بسیار سریع تر میباشد , چرا که این کنترل سمت کاربر میباشد.همچنین از کنترل Repeater به جای DataGrid و یا DataList استفاده کنیم زیرا این کنترل در سرعت عملکرد نرم افزار موثر میباشد .


از فراخوانی توابع AJAX به جای دستورات CodeBehind در Asp.Net استفاده میکنیم

Web Service را به جای فراخوانی از سمت سرور از Java Script و یا JQuery فراخوانی می کنیم .


محتوای خود را توسط Caching ذخیره کنید

Asp.Net ما را قادر میسازد که اطلاعات صفحه را در Cache صفحه ذخیره کنیم .همچنین شما میتوانید مقادیر با پارامترهای مخصوصی را در Cache ذخیره کنید ، با استفاده از Cache شما به موتور Asp.Net کمک میکنید که اطلاعات را برای درخواستهای تکراری در همان صفحه با سرعت بالا  نمایش دهد ،

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

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

جلوگیری از دستورات مدیریت نشده

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

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

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

رمزنگاری توسط ASCII در هنگامی که به UTF احتیاج ندارید

به صورت پیش فرض ، Asp.Net درخواست و پاسخ از سمت سرور را توسط UTF-8 رمزنگاری میکند .اگر روش ACII تمام روش رمزنگازی است که برنامه شما احتیاج دارد ،حذف UTF می تواند چندین چرخه را بازگرداند.لازم به ذکر است که این عمل را می توانیم برای هر نرم افزار یکبار اجرا نماییم .

پرهیز از توابع بازگشتی و حلقه های تو در تو

این عملیات که در برنامه نویسی رایج میباشد ، مقدار زیادی از حافظه را اشغال میکند که در نهایت سرعت عملکرد نرم افزار را کاهش میدهد .سعی کنید تا حد امکان از توابع بازگشتی(Recursive Function) و حلقه های تو در تو (Nested Loop) برای جلوگیری از کاهش سرعت عملکرد نرم افزار ، استفاده نکنید .

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

هنگامی که از ()toString به جای ()Format استفاده میکنید  ، در اغلب موارد نیازهای شما را با اشغال حجم کمتری از حافظه پاسخ می دهد .

از JavaScript و Css به صورت جداگانه استفاده کنید

استفاده از فایل javaScript و Css خارجی باعث میشود که صفحات نرم افزار سریعتر آماده نمایش شوند ، زیرا فایلهای JavaScript و Css یکبار توسط مرورگر در Cache کاربر ذخیره میشوند .قرار دادن اسکریپتهای و دستورات Css در داخل صفحه باعث میشود که حجم صفحه افزایش یابد که در نهایت سرعت بارگزاری صفحه را کاهش میدهد .

در هنگام عملیات چندگانه از Multi Thread استفاده کنید

مشکلی زمانی رخ می دهد که یک  دستور Single Thread در یک فرایند طولانی قرار گیرد .بنابراین هنگامی که ما mutiple service را  در یک متد فراخوانی میکنیم ،ما باید دو متد را با دو Thread جداگانه استفاده کنیم .دو متد به صورت جدا از دو Thread متفاوت استفاده می کند .

از فشرده سازی در سطح IIS استفاده نمایید

استفاده از فشرده سازی یک روش بسیار موثر برای کاهش زمان اجرای صفحات وب میباشد .فایل aspx. از سمت سرور به مرورگر ارسال میشود .HTML یک الگوریتم بسیار فشرده و متراکم میباشد مانند gzip ، بنابراین وب سرورهای جدید که IIS5 و بالاتر را دارند ، توانایی فشرده سازی فایل را دارند که در آن سمت مرورگرهای جدید قابلیت خارج کردن فایل از فشرده سازی را نیز دارند .

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

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

حذف ViewEngine استفاده نشده از Pipeline در MVC

به صورت پیش فرض Asp.Net دو روش برای View Engine در تکنولوژی MVC در نظر گرفته است .View Engine که در نرم افزار مورد استفاده قرار نمیگیرد باید حذف شود .به عنوان مثال اگر شما از Razor استفاده میکنید ، سپس کد زیررا باید در global.asax.cs نرم افزار خود اضافه نمایید .کد های MVC توسط aspx engineو razor engine کار میکند .

ViewEngines.Engines.Clear();  
ViewEngines.Engines.Add(new RazorViewEngine()); 

دستورات #C را در قسمت View در تکنولوژی MVC قرار ندهید

view ها در زمان اجرا(run time) ترجمه(compile) میشوند نه در زمان (compile time) .بنابراین اگر شما دستورات متعددی از #C را در View قرار دهید ، دستورات شما ترجمه نمی شود و در فایل DLL قرار میگیرد .نه تنها با این کار به عملیات تست نرم افزار خود لطمه وارد خواهیم کرد , بلکه سرعت عملکرد نرم افزار خود را کاهش می دهیم .

از کتابخانه هایی با سرعت عملکرد بالا (High Performance) استفاده نمایید

اخیراَ متوجه شدیم که قسمتی از مشکل سرعت عملکرد نرم افزار یا وب سایت ایجاد شده  مربوط به hotspot موجود در کد ها میباشد که از قسمتی که پیغامهای JSON نمایش داده میشود .این پیغامهای   deserialize JSON   میشوند .JSON از آنجایی شروع به کار کرد که کتابخانه Newtonsoft.json دیگر سریعترین کتابخانه موجود نبود ، از آن پس ما JSON.Net را با کتابخانه سریعتری (به عنوان مثال ServiceStack) جایگزین کردیم و نتیجه بهتری گرفتیم .

ترفندهایی برای بهبود عملیات در بانک اطلاعاتی

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

SQL Profile را بجای Solution database اجرا کنیم به هدف قرار دادن همه صفحات کلیدی .شناسایی عملگرهایی که حجم وسیعی از پردازشگر را اشغال میکنند .همچنین شناسایی تعداد عملگرهای SQL که در هر صفحه اجرا میشوند و تشخیص آن که کدام از این عملگرها را میتوان حذف کرد .هدف از این کار این است که حد اکثر یک تماس با بانک اطلاعاتی در هر صفحه باشد نه بیشتر .

برگرداندن چند نتیجه

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

ادغام اتصال(Connection Pooling) و ادغام اشیا,(Object Pooling)

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

- به اشتراک گذاری اتصال

- جلوگیری از ایجاد اتصال برای هر درخواست

- حذف تعداد اتصالات به بانک

- cache نکردن اتصالات

از SQLDataReader به جای DataBase در صورت امکان استفاده کنیم

اگر شما اطلاعات را از جدول به ترتیب فراخوانی کنید ، شما میتوانید از DataReader به جای DataSet استفاده کنیم .DataReader یک شئی فقط خواندنی را در هر جریان  از اطلاعات جدول ایجاد میکند. زیرا فقط یک سطر با هر دستور فراخوانی میشود .

بانک اطلاعاتی خود را کم حجم نگه دارید

به خاطر داشته باشید که dataset همه اطلاعات موجود در حافظه را  ذخیره می کند ، پس ممکن است اطلاعاتی بیشتر از آن باشد که احتیاج داریم .بنابراین اطلاعاتی را که به آنها احتیاج داریم در Dataset قرار دهیم .


پرهیز از query های بی کیفیت 

Query ها که یک فرایند را انجام میدهند و یک یا چند ستون از بانک را بر میگردانند چرخه زیادی از پردازشگر را اشغال می کنند که این حجم از پردازشگر میتوانست در خدمت عملیات مفیدتری قرار گیرد .اگر با هر Query تعداد زیادی اطلاعات بی استفاده بر گرداند معمولا به این Query ، یک Query بی کیفیت می گویند .مانند (Select * from Tblname) شما همیشه به این دستور برای نمایش کلیه اطلاعات جدول احتیاج ندارید .همچنین میتوانید Query خود را با دستور شرط(Where) تحلیل کنید و از نمایش کل اطلاعات جلوگیری کنید .


پرهیز از دستور auto-Generated

هنگامی که از data Adapter استفاده میکنید ، از دستور auto-generated پرهیز کنید .این دستور باعث میشود که درخواست های بیشتری به سمت سرور ارسال شود .می توانید با توجه به اهمیت دستور در نرم افزاری که می خواهید استفاده کنید .

از دسترسی ترتیبی در صورت امکان استفاده کنید

توسط data readerT میتوانید از CommandBehavior.SequentialAccess استفاده نمایید .این عمل برای اطلاعات با نوع BLOB ضروری میباشد .پس از آن شما میتوانید با هر با اتصال با یک قسمت از اطلاعات عملیات خود را انجام دهید .اگر شما به کل مقادیر با هر دستور برای عملیات خود احتیاج ندارید گزینه دسترسی نرنیبی(Sequential Access) میتواند گزینه مناسبی باشد .

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

از دستور NOCOUNT در StoreProcedure استفاده کنید .مایکروسافت استفاده از پیش فرضهایی مانند "_SP" برای ایجاد Store Procedure را توصیه نمی کند ، زیرا SQL Server همیشه Store Procedure که با پیش فرض "_SP" تعریف شده باشند را بانک اطلاعاتی اصلی در نظر میگیرد .

از قوانین زیر پیروی نمایید :

- index را با توجه به ترتیب استفاده منظم کنید

- index جدول را در حد امکان کوچک  تعریف کنید .

- یک بازه ای از اعداد برای index ها در نظر بگیرید

- استفاده از کلیدهای خارجی (Foreign Key) برای indexها

- index ترکیبی با ستون های محدودکننده ایجاد کنید

- از تعداد index بیشتر کوچک به جای اندک index یزرگ استفاده نمایید

- جداول و سطر ها را بخش بندی نمایید

- index بدون استفاده را حذف نمایید

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

استفاده از اتصال مناسب در WCF

انتخاب اتصال مناسب در WCf تاثیر مستقیم بر روی عملکرد نرم افزار دارد .تعدادی روش حاضر برای اتصال در سرویس WCF وجود دارد .هر روش برای هدفی خاص و امنیت بانک تنظیم شده است .با توجه به احتیاج نرم افزار میتوانیم اتصال مناسب را انتخاب نماییم .به عنوان مثال اگر ما سرویس WCF را ایجاد کنیم ، که در آغاز  از WSHttpBinding استفاده میکند ، این نوع اتصال هزینه بیشتری برای امنیت دارد .Session و جریان  قابل اعتماد و مطمئن است . اگر ما BasicHttpBinding را بجای آن (WSHttpBinding) انتخاب نماییم عملکرد نرم افزار به نحوی چشمگیر افزایش میابد .

Throttling

Throttling یک عنصر کلیدی دیگر برای بهبود عملکرد نرم افزار در WCF میباشد .WCF Thorttoling که تنظیمات maxConcurrentCalls را در اختیار ما قرار می دهد .maxConcurrentInstance و maxConcurrentSession که به ما در محدودیت تعداد instance های موجود در Session کمک میکند .


    <serviceThrottling   
    maxConcurrentCalls="16" maxConcurrentSessions="100" maxConcurrentInstances="10" />  

استفاده از داده های Contract Serialization

serialization فرایند برای تبدیل یک مقدار به فرمت قابل حمل میباشد .Serialization مربوط به XML و binary از serialization های  بسیار رایج میباشند .serialization مربوط به XML برای قابلیت همکاری(interoperability) بسیار رایج میباشد و binary serialization برای انتقال مقادیر بین دو نرم افزار استفاده میشود .

Caching

وابستگی خارجی نیز یکی از مشکلات اصلی در سرویس WCF میباشد .ما با استفاده از Caching می توانیم این مشکل را بر طرف کنیم .Caching به ما اجازه میدهد که اطلاعات را در حافظه یا یک مکان دیگر که بتوانیم به سرعت به آنها دسترسی داشته باشیم را ذخیره کنیم .ما دو گزینه برای ذخیره مقادیر داریم.

1 در حافظه

2 caching خارجی

1 :در حافظه : سرویس wcf به صورت پیش فرض به اطلاعات موجود در Cache دسترسی ندارد .ما میتوانیم این امکان را با افزودن خاصیت "ASPNETCompatibilityRequirements" فراهم کنیم .

[AspNetCompatibilityRequirements ( RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]  
  
<system.serviceModel>  
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />  
</system.serviceModel>

2 : chaching خارجی .مشکلی که در حالت در حافظه وجود دارد ، این است که  اگر کاربر تغییری در ان انجام دهد برای منقضی کردن آن بسیار مشکل است .این sticky Session ها به اصطلاح به ما برای حل این مشکل کمک میکند .تمام درخواست ها از همان آدرس IP ارسال میشوند و به همان آدرس سرور ارسال میشود .این عمل فراخوانی sticky session نام دارد .همچنین ما میتوانیم از windows server fabric به عنوان cache مخصوص سرور استفاده نماییم .

اطلاعات فشرده

فقط اطلاعات serialize شده به سمت شبکه ارسال میشوند .به عبارت دیگر از ارسال اطلاعات بدون استفاده پرهیز نمایید .

تنظیم خاصیت transport و reader Quotasدر wcf

خاصیت transport که مانند timeout میباشد .تخصیص حافظه محدود و اندازه مجموعه محدود داریم .همچنین به ما در بهبود عملکرد سرویس کمک میکند .TimeOut برای جلوگیری از  DOS Attack استفاده میشود.

تعادل بار و افزایش در سمت سرور را در نظر بگیرید

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

کد نویسی تمیز در فاز توسعه با استفاده از FXCOP

FXCOP ابزاری میباشد که توسط مایکروسافت ارائه شده و برای محدود کردن برنامه نویسان در نوشتن کدها استفاده میشود که میتواند یکی از عوامل افزایش عملکرد نرم افزار باشد .اگر ما از قوانین FXCop پی روی کنیم و سپس برنامه خود را Build کنیم برنامه پیغام succes را تا اینکه تمامی پیغامهای خطا را برطرف نماییم ، نمایش نمی دهد .

برخی از قوانین FXCOP :

- پرهیز از استفاده از local بیش از حد

- پرهیز از نوشتن کد های فراخوانی نشده

- پرهیز از کلاسهای داخلی بدون نمونه

- پرهیز از خاصیت های استفاده نشده

- بازخوانی پارامترهای استفاده نشده

- از رشته های زنجیره ای در حلقه استفاده نکنید .

- خاصیت ها نباید یک آرایه را برگردانند

- بررسی خالی بودن رشته ها برای اندازه گیری طول رشته

ابزارهایی برای بهبود عملکرد نرم افزار

این ابزارها برای نظارت بر عملکرد کدها استفاده میشود .تعدادی ابزار برای  شمارندش میزان عملکرد برای مقادیر موجود در NET. وجود دارد که بر روی هر قسمت از بهبود عملکرد نرم افزار متمرکز میشود .این ابزارها برای ارائه اطلاعات از نحوه عملکرد سیستم عامل، نرم افزار، سرویسها ، یا حافظه های جانبی بکار میرود .این ابزارها ما را در کاستی و بهبود نرم افزار آگاه میسازد .

در ادامه به تعدادی از این ابزارها اشاره میکنیم :

- Net Memory Profiler.

- App Dynamic

-Red Gate Ants Profiler

- Fiffler

- Performance Counters by Perform

 

 

احسان حسینی

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

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

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