#Performance #Analyse #PageSpeed #YSlow
سایتی برای سنجش performance و سرعت لود سایت به همراه پیشنهاد هایی برای بهبود سایت
gtmetrix.com
سایتی برای سنجش performance و سرعت لود سایت به همراه پیشنهاد هایی برای بهبود سایت
gtmetrix.com
#CheckList #AspNet #AspMvc #Performance
http://www.lyntonweb.com/hs-fs/hub/74005/file-2275583083-jpg/Checklist1.jpg
چک لیست تهیه یک برنامه AspNet MVC
http://goo.gl/yuy6SB
چک لیست برنامه های AspNet
http://goo.gl/Fj7Rwi
چک لیست Performance برنامه های AspNet
http://goo.gl/wjdXYp
@IranAspMvc
http://www.lyntonweb.com/hs-fs/hub/74005/file-2275583083-jpg/Checklist1.jpg
چک لیست تهیه یک برنامه AspNet MVC
http://goo.gl/yuy6SB
چک لیست برنامه های AspNet
http://goo.gl/Fj7Rwi
چک لیست Performance برنامه های AspNet
http://goo.gl/wjdXYp
@IranAspMvc
#EntityFramework #Performance #SpeedUp
راه های افزایش سرعت و پرفرمنس Entity Framework
—------------------------------
این باعث میشه که ChangeTracker غیر فعال بشه و برای مواقع Select نمایشی به درد میخوره.
db.Configuration.AutoDetectChangesEnabled = false;
—------------------------------
این درستور هم اخر کوئری هاتون میتونین بنویسید. کار همین بالایی رو انجام میده
db.Users.Select(p => p).AsNoTracking();
—------------------------------
این درستور Validation اعتبارسنجی توکار EF رو غیر فعال میکنه. زمانی از این استفاده کنین که از صحت اطلاعاتتون مطمئن هستید.
db.Configuration.ValidateOnSaveEnabled = false;
—------------------------------
استفاه از Skip و Take جهت صفحه بندی هم باید حواستون باشه
—------------------------------
دونستن فرق بین IQueryable و IEnumerable و اینکه چگونه ازشون استفاده کنیم هم خیلی مهمه (نکته : تمامی فیلتر های where رو قبل از .ToList انجام بدید)
http://www.dotnettips.info/Post/473
—------------------------------
فقط فیلد هایی که نیاز دارین رو توی Select بیارین نه همه فیلد ها
db.Users.Select(p => new { p.Id, p.Username, p.Fullname });
—------------------------------
از چندین dbContext استفاده نکنیم. از الگوی One Context Per Request استفاده کنیم.
—------------------------------
استفاده به جا از Eager loading و Lazy loading هم خیلی مهمه
http://www.dotnettips.info/post/840
—------------------------------
در تراکنش های بالا هر از چندگاهی Context مون رو Dispose کنیم و یا Context جدید ایجاد کنیم. به دلیل ذخیره شدن تمام تراکنش ها در حافظه در تراکنش های بالا با مشکل کمبود حافظه و کندی سرعت مواجه میشوید
—------------------------------
برای افزودن تعداد رکور بالا به صورت همزمان بهتره از BulkInsert استفاده کنین
چندین پلاگین برای اینکار وجود داره. از جمله :
EntityFramework.BulkInsert
EntityFramework.Extended
EntityFramework.Utilities
که بهترین اون ها EntityFramework.BulkInsert هست
http://goo.gl/hXxLvI
—------------------------------
منابع :
https://goo.gl/QW2CBW
http://goo.gl/1ACSwA
http://goo.gl/15ArJO
@IranAspMvc
راه های افزایش سرعت و پرفرمنس Entity Framework
—------------------------------
این باعث میشه که ChangeTracker غیر فعال بشه و برای مواقع Select نمایشی به درد میخوره.
db.Configuration.AutoDetectChangesEnabled = false;
—------------------------------
این درستور هم اخر کوئری هاتون میتونین بنویسید. کار همین بالایی رو انجام میده
db.Users.Select(p => p).AsNoTracking();
—------------------------------
این درستور Validation اعتبارسنجی توکار EF رو غیر فعال میکنه. زمانی از این استفاده کنین که از صحت اطلاعاتتون مطمئن هستید.
db.Configuration.ValidateOnSaveEnabled = false;
—------------------------------
استفاه از Skip و Take جهت صفحه بندی هم باید حواستون باشه
—------------------------------
دونستن فرق بین IQueryable و IEnumerable و اینکه چگونه ازشون استفاده کنیم هم خیلی مهمه (نکته : تمامی فیلتر های where رو قبل از .ToList انجام بدید)
http://www.dotnettips.info/Post/473
—------------------------------
فقط فیلد هایی که نیاز دارین رو توی Select بیارین نه همه فیلد ها
db.Users.Select(p => new { p.Id, p.Username, p.Fullname });
—------------------------------
از چندین dbContext استفاده نکنیم. از الگوی One Context Per Request استفاده کنیم.
—------------------------------
استفاده به جا از Eager loading و Lazy loading هم خیلی مهمه
http://www.dotnettips.info/post/840
—------------------------------
در تراکنش های بالا هر از چندگاهی Context مون رو Dispose کنیم و یا Context جدید ایجاد کنیم. به دلیل ذخیره شدن تمام تراکنش ها در حافظه در تراکنش های بالا با مشکل کمبود حافظه و کندی سرعت مواجه میشوید
—------------------------------
برای افزودن تعداد رکور بالا به صورت همزمان بهتره از BulkInsert استفاده کنین
چندین پلاگین برای اینکار وجود داره. از جمله :
EntityFramework.BulkInsert
EntityFramework.Extended
EntityFramework.Utilities
که بهترین اون ها EntityFramework.BulkInsert هست
http://goo.gl/hXxLvI
—------------------------------
منابع :
https://goo.gl/QW2CBW
http://goo.gl/1ACSwA
http://goo.gl/15ArJO
@IranAspMvc
.NET Tips
تفاوت بین IQueryable و IEnumerable در حین کار با ORMs
متد زیر را که یکی از اشتباهات رایج حین استفاده از LINQ خصوصا جهت Binding اطلاعات است، در نظر بگیرید:IQueryable GetCustomers()این متد در حقیقت هیچ چیزی را Get نمیکند! نام اصلی آن GetQueryableCustomers و یا GetQueryObjectForCustomersاست.IQueryable قلب LINQ…
معرفی کتابخانه EFCore.BulkExtensions
در سری #معرفی_اکستنشن_های_کاربردی_EFCore
در حالت عادی (متد Add و یا AddRange)، رکورد های شما به صورت تکی Insert میشه و سرعت بالایی نداره، بر خلافش اما، در روش Bulk Insert، همه رکورد ها به صورت یکجا Insert میشن و سرعت بسیار بسیار بالایی داره این روش (حتی تا 20 برابر سریع تر!)
این کتابخونه بی نظیر، قابلیت انجام عملیات Bulk و Batch رو در EF Core فراهم میکنه و از async هم پیشتیبانی میکنه :
- Bulk operations (Insert, Update, Delete, Read, Upsert, Sync)
- Batch operations (Delete, Update)
* برای مقایسه پرفرمنس و تفاوت سرعت بین روش عادی و Bulk هم تصویر پست گویای همه چی هست
لینک ریپازیتوری + مثال و توضیحات :
https://github.com/borisdj/EFCore.BulkExtensions
#Bulk #EFCore #Performance
@IranAspMvc
در سری #معرفی_اکستنشن_های_کاربردی_EFCore
Entity Framework Core Bulk Batch Extensions for Insert Update Delete and Read (CRUD) operations on SQL Serverخیلی وقتا نیاز میشه یک مرتبه حجم زیادی از رکورد ها رو توسط EFCore ذخیره کنین (مثلا import کردن از یه فایل excel)
در حالت عادی (متد Add و یا AddRange)، رکورد های شما به صورت تکی Insert میشه و سرعت بالایی نداره، بر خلافش اما، در روش Bulk Insert، همه رکورد ها به صورت یکجا Insert میشن و سرعت بسیار بسیار بالایی داره این روش (حتی تا 20 برابر سریع تر!)
این کتابخونه بی نظیر، قابلیت انجام عملیات Bulk و Batch رو در EF Core فراهم میکنه و از async هم پیشتیبانی میکنه :
- Bulk operations (Insert, Update, Delete, Read, Upsert, Sync)
- Batch operations (Delete, Update)
* برای مقایسه پرفرمنس و تفاوت سرعت بین روش عادی و Bulk هم تصویر پست گویای همه چی هست
لینک ریپازیتوری + مثال و توضیحات :
https://github.com/borisdj/EFCore.BulkExtensions
#Bulk #EFCore #Performance
@IranAspMvc
خااااار و مادر سرعت توی عملیات Linq با کتابخانه LinqFaster !
این کتابخانه با استفاده از تکنولوژی SIMD (ساده بگم : پردازش برداری موازی و فوق سریع) و پردازش موازی با Multi-Threading اومده و متد های کمکی مشابه ایی نوشته که عملیات Linq رو با سرعت بالا و مصرف حافظه کمتر انجام میده.
فقط کافیه بنچمارک رو توی تصویر ببینین :)
LinqFaster
متدهای کمکی Linq با پرفرمنس بالا
https://www.nuget.org/packages/LinqFaster/
LinqFaster.SIMD
متدهای کمکی Linq با پرفرمنس بالا با استفاده از تکنولوژی SIMD
https://www.nuget.org/packages/LinqFaster.SIMD/
LinqFaster.Parallel
متدهای کمکی Linq با پرفرمنس بالا با استفاده از پردازش موازی/Multi-Threading
https://www.nuget.org/packages/LinqFaster.Parallel/
LinqFaster.SIMD.Parallel
متدهای کمکی Linq با پرفرمنس بالا با استفاده از تکنولوژی SIMD و پردازش موازی/Multi-Threading
https://www.nuget.org/packages/LinqFaster.SIMD.Parallel/
لینک ریپازیتوری :
https://github.com/jackmott/LinqFaster
#Linq #Performance
@IranAspMvc
این کتابخانه با استفاده از تکنولوژی SIMD (ساده بگم : پردازش برداری موازی و فوق سریع) و پردازش موازی با Multi-Threading اومده و متد های کمکی مشابه ایی نوشته که عملیات Linq رو با سرعت بالا و مصرف حافظه کمتر انجام میده.
فقط کافیه بنچمارک رو توی تصویر ببینین :)
LinqFaster
متدهای کمکی Linq با پرفرمنس بالا
https://www.nuget.org/packages/LinqFaster/
LinqFaster.SIMD
متدهای کمکی Linq با پرفرمنس بالا با استفاده از تکنولوژی SIMD
https://www.nuget.org/packages/LinqFaster.SIMD/
LinqFaster.Parallel
متدهای کمکی Linq با پرفرمنس بالا با استفاده از پردازش موازی/Multi-Threading
https://www.nuget.org/packages/LinqFaster.Parallel/
LinqFaster.SIMD.Parallel
متدهای کمکی Linq با پرفرمنس بالا با استفاده از تکنولوژی SIMD و پردازش موازی/Multi-Threading
https://www.nuget.org/packages/LinqFaster.SIMD.Parallel/
لینک ریپازیتوری :
https://github.com/jackmott/LinqFaster
#Linq #Performance
@IranAspMvc
❇️ خواهشا از HttpClient درست استفاده کنیم! (قسمت اول)
کلاس HttpClient محبوب ترین کلاس برای ارتباطات Http است ولی متاسفانه اکثرا از آن بدستی استفاده نمیکنند!
در این پست میخواهیم Best Practice های آن را بررسی کنیم.
در دات نت، 3 کلاس پایه برای ارتباطات Http داریم :
1️⃣ کلاس HttpWebRequest : اولین و low-level ترین کلاس که کنترل بیشتری به شما می دهد
2️⃣ کلاس WebClient : یک محصور کننده hight-level بر روی HttpWebRequest که کنترل کمتری به شما می دهد ولی طرز استفاده آن ساده تر است
3️⃣ کلاس HttpClient : بهینه ترین کلاس موجود برای ارتباطات Http که مزایای هر دو کلاس قبل را داشته و در دات نت 4.5 به بعد (و نیز تمامی ورژن های NETCore) اضافه شد (البته پکیج Nuget آن برای دات نت 4.0 هم وجود دارد)
کلاس HttpClient نسبت به دو کلاس قبلی پرفرمنس بیشتری داشته و متد های اصلی آن (از جمله GetAsync و PostAsync و...) thread-safe است درنتیجه میتوان یک نسخه از آن به صورت Singleton ایجاد و به صورت concurrent استفاده شود.
یک قابلیت مهم دیگر این آن، امکان Chain کردن HttpMessageHandlers ها در HttpClient است (چیزی شبیه به Pipeline میدلور ها در ASP Core) که میتوان از آن برای Logging، Caching و Error handling و ... استفاده کرد (مثال)
4️⃣ کتابخانه RestSharp نیز یک کتابخانه third-party برای ارتباطات Http و مخصوصا REST بوده ولی درون خود از HttpWebRequest استفاده میکند نه HttpClient و پرفرمنس کمتری دارد (نزدیک به نصف!)
5️⃣ کتابخانه Refit هم هست که با قابلیت های مدرن زیادی داره و کار با RESTful API ها رو خیلی راحت میکنه و البته از HttpClient هم استفاده میکنه (در حال حاضر بهترین کتابخانه third-party)
🔰 نکته بسیار مهم، استفاده بهینه و صحیح از این کلاس است که متاسفانه خیلی ها به اشتباه از آن استفاده میکنند
🔸کلاس HttpClient نباید هربار و به ازای هر درخواست، ساخته (new) شود که در این صورت پرفرمنس را به شدت کاهش میدهد!
🔹با وجود اینکه استفاده از یک شی Singleton آن نسبت به ایجاد هر باره آن بهتر است ولی باز هم صحیح نیست و باعث میشود از تغییرات DNS آگاه نشود!
🔸قبلا گفتیم که فقط متد های اصلی آن thread-safe است، پس پروپرتی های آن مانند (DefaultRequestHeaders و BaseAddress و Timeout و ...) thread-safe نیست و نباید بین ترد های مختلف به صورت مشترک استفاده شود
مثلا اگر یک شی Singleton یا static از HttpClient داشته باشید و در میان ترد های مختلف از آن استفاده کنید ممکن است در آن واحد که یک ترد در حال درخواست زدن به یک url است، ترد دیگری BaseAddress آن را تغییر دهد
🔹با وجود اینکه کلاس کلاس HttpClient یک شی Disposable است ولی نباید به صورت دستی Dispose شود درنتیجه استفاده از آن در کنار using (برای Dispose خودکار) به شدت اشتباه است و باعث مشکل حادی را به نام sockets exhaustion (اشباع سوکت های باز) میشود.
🔸نکته قبل، برای خروجی متد های آن، یعنی کلاس HttpResponseMessage صادق نیست و آن هارا باید حتما توسط using یا به صورت دستی Dispose کرد (البته در حالت دستی اگر exception ایی رخ دهد Dispose رخ نخواهد داد پس باید در بلاک try finaly نوشته شود)
🔹نکته بسیار مهم دیگر این است که به هیچ عنوان از کلاس HttpClient به صورت sync استفاده نکنید، ارتباطات network یکی از مهمترین عوامل block کننده thread بوده و دلیل اصلی اینکه کلاس HttpClient فقط و فقط دارای متد های async است همین بوده.
در نتیجه، استفاده از متد های آن به صورت sync همراه با Task.Wait و Task.Result به شدت اشتباه است و باعث بلاک شدن ترد می شود. (این مقوله برای تمامی متد های async صادق است و حتی می تواند باعث dead-lock شود)
در قسمت بعد اصولی ترین و بهینه ترین روش کار با HttpClient را بررسی خواهیم کرد.
#Performance #HttpClient
__________________
@DotNetZoom
کلاس HttpClient محبوب ترین کلاس برای ارتباطات Http است ولی متاسفانه اکثرا از آن بدستی استفاده نمیکنند!
در این پست میخواهیم Best Practice های آن را بررسی کنیم.
در دات نت، 3 کلاس پایه برای ارتباطات Http داریم :
1️⃣ کلاس HttpWebRequest : اولین و low-level ترین کلاس که کنترل بیشتری به شما می دهد
2️⃣ کلاس WebClient : یک محصور کننده hight-level بر روی HttpWebRequest که کنترل کمتری به شما می دهد ولی طرز استفاده آن ساده تر است
3️⃣ کلاس HttpClient : بهینه ترین کلاس موجود برای ارتباطات Http که مزایای هر دو کلاس قبل را داشته و در دات نت 4.5 به بعد (و نیز تمامی ورژن های NETCore) اضافه شد (البته پکیج Nuget آن برای دات نت 4.0 هم وجود دارد)
کلاس HttpClient نسبت به دو کلاس قبلی پرفرمنس بیشتری داشته و متد های اصلی آن (از جمله GetAsync و PostAsync و...) thread-safe است درنتیجه میتوان یک نسخه از آن به صورت Singleton ایجاد و به صورت concurrent استفاده شود.
یک قابلیت مهم دیگر این آن، امکان Chain کردن HttpMessageHandlers ها در HttpClient است (چیزی شبیه به Pipeline میدلور ها در ASP Core) که میتوان از آن برای Logging، Caching و Error handling و ... استفاده کرد (مثال)
4️⃣ کتابخانه RestSharp نیز یک کتابخانه third-party برای ارتباطات Http و مخصوصا REST بوده ولی درون خود از HttpWebRequest استفاده میکند نه HttpClient و پرفرمنس کمتری دارد (نزدیک به نصف!)
5️⃣ کتابخانه Refit هم هست که با قابلیت های مدرن زیادی داره و کار با RESTful API ها رو خیلی راحت میکنه و البته از HttpClient هم استفاده میکنه (در حال حاضر بهترین کتابخانه third-party)
🔰 نکته بسیار مهم، استفاده بهینه و صحیح از این کلاس است که متاسفانه خیلی ها به اشتباه از آن استفاده میکنند
🔸کلاس HttpClient نباید هربار و به ازای هر درخواست، ساخته (new) شود که در این صورت پرفرمنس را به شدت کاهش میدهد!
🔹با وجود اینکه استفاده از یک شی Singleton آن نسبت به ایجاد هر باره آن بهتر است ولی باز هم صحیح نیست و باعث میشود از تغییرات DNS آگاه نشود!
🔸قبلا گفتیم که فقط متد های اصلی آن thread-safe است، پس پروپرتی های آن مانند (DefaultRequestHeaders و BaseAddress و Timeout و ...) thread-safe نیست و نباید بین ترد های مختلف به صورت مشترک استفاده شود
مثلا اگر یک شی Singleton یا static از HttpClient داشته باشید و در میان ترد های مختلف از آن استفاده کنید ممکن است در آن واحد که یک ترد در حال درخواست زدن به یک url است، ترد دیگری BaseAddress آن را تغییر دهد
🔹با وجود اینکه کلاس کلاس HttpClient یک شی Disposable است ولی نباید به صورت دستی Dispose شود درنتیجه استفاده از آن در کنار using (برای Dispose خودکار) به شدت اشتباه است و باعث مشکل حادی را به نام sockets exhaustion (اشباع سوکت های باز) میشود.
🔸نکته قبل، برای خروجی متد های آن، یعنی کلاس HttpResponseMessage صادق نیست و آن هارا باید حتما توسط using یا به صورت دستی Dispose کرد (البته در حالت دستی اگر exception ایی رخ دهد Dispose رخ نخواهد داد پس باید در بلاک try finaly نوشته شود)
🔹نکته بسیار مهم دیگر این است که به هیچ عنوان از کلاس HttpClient به صورت sync استفاده نکنید، ارتباطات network یکی از مهمترین عوامل block کننده thread بوده و دلیل اصلی اینکه کلاس HttpClient فقط و فقط دارای متد های async است همین بوده.
در نتیجه، استفاده از متد های آن به صورت sync همراه با Task.Wait و Task.Result به شدت اشتباه است و باعث بلاک شدن ترد می شود. (این مقوله برای تمامی متد های async صادق است و حتی می تواند باعث dead-lock شود)
در قسمت بعد اصولی ترین و بهینه ترین روش کار با HttpClient را بررسی خواهیم کرد.
#Performance #HttpClient
__________________
@DotNetZoom
www.nuget.org
System.Net.Http 4.0.0
Provides modern classes for sending HTTP requests and receiving HTTP responses from a resource identified by a URI.
Commonly Used Types:
System.Net.Http.HttpResponseMessage
System.Net.Http.DelegatingHandler
System.Net.Http.HttpRequestException
System.Ne…
Commonly Used Types:
System.Net.Http.HttpResponseMessage
System.Net.Http.DelegatingHandler
System.Net.Http.HttpRequestException
System.Ne…
❇️ خواهشا از HttpClient درست استفاده کنیم! (قسمت دوم)
در قسمت قبل روش های کار با Http و مزایا و معایب هرکدام را بررسی کردیم و به نکات و Best Practice های استفاده از HttpClient پرداختیم
در این قسمت میخواهیم بهترین روش استفاده از آن را بررسی کنیم
اصولی ترین و بهینه ترین حالت استفاده از HttpClient، استفاده از کلاس HttpClientFactory موجود در NET Core 2.1. به بعد است
این کلاس وهله سازی HttpClient و Dispose کردن آن را به صورت خودکار و استاندارد به عهده میگیرد و توسط مکانیزم Pooling (استخری از HttpClient ها) وهله های ایجاد شده را مجددا برای درخواست های بعدی استفاده می کند
بدین ترتیب HttpClientFactory از HttpClient های خود، به بهینه ترین نحو استفادهی مجدد میکند و همچنین سربار ایجاد HttpClientهای جدید نیز به حداقل میرسند.
در این روش دیگر مشکل نشتی حافظه یا کمبود منابع ناشی از Dispose نشدن HttpClient ها را نخواهیم داشت زیرا Lifetime وهله ها توسط HttpClientFactory مدیریت می شود
همچنین دیگر مشکل sockets exhaustion (اشباع سوکت های باز) و آگاه نشدن از تغییرات DNS را نخواهیم داشت
برای استفاده از این کلاس 4 روش موجود است
Basic usage
Named clients
Typed clients
Generated clients
روش Basic روش ساده و معمول آن است ولی معمولا در پروژه ها لازم است یک سری کانفیگ خاص را برای هر HttpClient تنظیم کنیم
مثلا HttpClient ایی که قرار است به سایت A درخواست بزند BaseAddress و Timeout و DefaultRequestHeaders (هدرهای پیشفرض) خود را دارد
از انجایی که این پروپرتی ها thread-safe نیستند بهترین راه استفاده از روش های Named clients و Typed clients است
نکته و محدودیت ای که در ورش Typed clients وجود دارد اینست که کلاس استفاده کننده از آن HttpClient الزاما به صورت Transient رجیستر میشود که باید مد نظر داشت و در صورت نیاز از روش Named clients یا ترفند های دیگر استفاده کرد.
روش Generated clients هم مخصوص استفاده از HttpClient توسط کتابخانه های third-party مانند Refit (که در قسمت قبل بررسی کردیم) است
برای یادگرفتن روش صحیح استفاده از HttpClient پیشنهاد میکنم حتما این 3 مقاله را بخوانید
https://www.dotnettips.info/post/2801
https://www.dotnettips.info/post/3022
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.2
#Performance #HttpClient
_____________________
@DotNetZoom
در قسمت قبل روش های کار با Http و مزایا و معایب هرکدام را بررسی کردیم و به نکات و Best Practice های استفاده از HttpClient پرداختیم
در این قسمت میخواهیم بهترین روش استفاده از آن را بررسی کنیم
اصولی ترین و بهینه ترین حالت استفاده از HttpClient، استفاده از کلاس HttpClientFactory موجود در NET Core 2.1. به بعد است
این کلاس وهله سازی HttpClient و Dispose کردن آن را به صورت خودکار و استاندارد به عهده میگیرد و توسط مکانیزم Pooling (استخری از HttpClient ها) وهله های ایجاد شده را مجددا برای درخواست های بعدی استفاده می کند
بدین ترتیب HttpClientFactory از HttpClient های خود، به بهینه ترین نحو استفادهی مجدد میکند و همچنین سربار ایجاد HttpClientهای جدید نیز به حداقل میرسند.
در این روش دیگر مشکل نشتی حافظه یا کمبود منابع ناشی از Dispose نشدن HttpClient ها را نخواهیم داشت زیرا Lifetime وهله ها توسط HttpClientFactory مدیریت می شود
همچنین دیگر مشکل sockets exhaustion (اشباع سوکت های باز) و آگاه نشدن از تغییرات DNS را نخواهیم داشت
برای استفاده از این کلاس 4 روش موجود است
Basic usage
Named clients
Typed clients
Generated clients
روش Basic روش ساده و معمول آن است ولی معمولا در پروژه ها لازم است یک سری کانفیگ خاص را برای هر HttpClient تنظیم کنیم
مثلا HttpClient ایی که قرار است به سایت A درخواست بزند BaseAddress و Timeout و DefaultRequestHeaders (هدرهای پیشفرض) خود را دارد
از انجایی که این پروپرتی ها thread-safe نیستند بهترین راه استفاده از روش های Named clients و Typed clients است
نکته و محدودیت ای که در ورش Typed clients وجود دارد اینست که کلاس استفاده کننده از آن HttpClient الزاما به صورت Transient رجیستر میشود که باید مد نظر داشت و در صورت نیاز از روش Named clients یا ترفند های دیگر استفاده کرد.
روش Generated clients هم مخصوص استفاده از HttpClient توسط کتابخانه های third-party مانند Refit (که در قسمت قبل بررسی کردیم) است
برای یادگرفتن روش صحیح استفاده از HttpClient پیشنهاد میکنم حتما این 3 مقاله را بخوانید
https://www.dotnettips.info/post/2801
https://www.dotnettips.info/post/3022
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.2
#Performance #HttpClient
_____________________
@DotNetZoom
Docs
Make HTTP requests using IHttpClientFactory in ASP.NET Core
Learn about using the IHttpClientFactory interface to manage logical HttpClient instances in ASP.NET Core.
❇️ عیب یابی و رفع مشکلات پرفرمنسی
در یکی از شرکت هایی که مشاور هستم از من خواسته شده تا مشکلات پرفرمنسی پروژه را پیدا کرده و مناسب ترین راه حل را به آنها پیشنهاد دهم
در هر پروژه ای احتمالا قسمت های زیادی قابل بهبود هستند (چه از لحاظ پرفرمنسی و چه از لحاظ معماری و کدنویسی تمیز و...) اما برای یافتن موثر ترین راه و البته کم هزینه ترین، باید ابتدا Bottleneck (گلوگاه) های سیستم را کشف کرده و سپس بر اساس «هزینه، زمان و منفعت» آنها را الویت بندی کنیم
برای کشف گلوگاه های سیستم (جاهایی که عامل اصلی افت پرفرمنس هستند) باید از ابزار های Profiler استفاده کنیم.
در کل پروفایلر های مختلفی وجود دارند که اکثرا پولی هستند در اینجا میخواهم بهترین آنها رو معرفی کنم
بهترین ابزار های Performance Profiler
1️⃣ برنامه ANTS Performance Profiler (محصول شرکت Redgate)
2️⃣ برنامه dotTrace (محصول شرکت JetBrains)
3️⃣ برنامه PerfView (محصولی "رایگان و سورس باز" از شرکت Microsoft)
4️⃣ برنامه CodeTrack (محصولی "رایگان و سورس باز")
هر چهار برنامه قابلیت های قوی و زیادی دارند از مهمترین شون میشه به موارد زیر اشاره کرد
🔸 قابلیت ثبت سلسله مراتب فراخوانی متد ها
توسط این قابلیت که اصلاحا بهش Call tree میگن میشه فهمید که چه متدی چه متد های دیگه ای رو فراخوانی کرده یا مثلا یک متد کلا چندبار صدا زده شده و هر متد چقدر به طول انجامیده (در قالب یک Timeline کامل) و ....
🔹 قابلیت ثبت تمام کوئری های اجرا شده بر روی دیتابیس
توسط این قابلیت میشه دید چه کوئری هایی و مثلا یک کوئری چندبار روی دیتابیس اجرا شده و هرکدوم چقدر زمان بره و...
🔸 قابلیت ثبت تمام Exception های رخ داده به همراه جزئیات و stacktrace
🔹 قابلیت نمایش تمام Thread های ایجاد شده و فرایند های انجام شده داخلش هر کدومشون و یا کلیه فرایند های انجام شده داخل یک Process
🔸 قابلیت پروفایل کردن همه برنامه ها از جمله
.NET Framework, .NET Core و ASP.NET, ASP.NET Core, Webservices, WCF, Windows Forms, Windows services, WPF ,IIS Website, IIS Express Website, Attach to a running process
❇️ این قابلیت ها برای عیب یابی به شدت مفید هستند چون توی یه سیستم با تراکنش بالا که بعضی مشکلات رو نمیشه پیش بینی کرد با این به راحتی میشه متد ها و یا کوئری های سنگین و اضافه ای که باعث افت پرفرمنس میشه رو پیدا کرد
❇️ هر دو برنامه ANTS و dotTrace پولی بوده و جز بهترین و محبوبترین برنامه های Performance Profiler هستند.
برنامه dotTrace یکپارچگی خوبی با Resharper داره و Visual Studio داره ولی شخصا با توجه به تجربه کاری با جفتشون، برنامه ANTS رو بیشتر می پسندم؛ کارکردن باهاش راحته و UX خوبی داره گزارشات و خروجی کاربردی تری نشون میده
ANTS Performance Profiler overview (ویدئو دمو برنامه)
https://www.youtube.com/watch?v=8mhC-Ji6-uU
❇️ برنامه PerfView هم تقریبا همین قابلیت ها رو داره ولی کارکردن باهاش سخت تره و UX خوبی نداره ولی چون رایگانه محبوبه
برنامه CodeTrack هم قابلیت هاش (نسبت به قبلی ها) کمتره ولی کارکردن باهاش راحته و UX متوسطی داره ونیز رایگانه
❇️ یه قابلیت خوبی که فقط dotTrace داره قابلیت Remote Profiling هست که توسط اون میتونین به برنامه هاتون روی یه سرور Remote دیگه متصل بشین و پرفایلش کنین
#Performance
____________________
@DotNetZoom
در یکی از شرکت هایی که مشاور هستم از من خواسته شده تا مشکلات پرفرمنسی پروژه را پیدا کرده و مناسب ترین راه حل را به آنها پیشنهاد دهم
در هر پروژه ای احتمالا قسمت های زیادی قابل بهبود هستند (چه از لحاظ پرفرمنسی و چه از لحاظ معماری و کدنویسی تمیز و...) اما برای یافتن موثر ترین راه و البته کم هزینه ترین، باید ابتدا Bottleneck (گلوگاه) های سیستم را کشف کرده و سپس بر اساس «هزینه، زمان و منفعت» آنها را الویت بندی کنیم
برای کشف گلوگاه های سیستم (جاهایی که عامل اصلی افت پرفرمنس هستند) باید از ابزار های Profiler استفاده کنیم.
در کل پروفایلر های مختلفی وجود دارند که اکثرا پولی هستند در اینجا میخواهم بهترین آنها رو معرفی کنم
بهترین ابزار های Performance Profiler
1️⃣ برنامه ANTS Performance Profiler (محصول شرکت Redgate)
2️⃣ برنامه dotTrace (محصول شرکت JetBrains)
3️⃣ برنامه PerfView (محصولی "رایگان و سورس باز" از شرکت Microsoft)
4️⃣ برنامه CodeTrack (محصولی "رایگان و سورس باز")
هر چهار برنامه قابلیت های قوی و زیادی دارند از مهمترین شون میشه به موارد زیر اشاره کرد
🔸 قابلیت ثبت سلسله مراتب فراخوانی متد ها
توسط این قابلیت که اصلاحا بهش Call tree میگن میشه فهمید که چه متدی چه متد های دیگه ای رو فراخوانی کرده یا مثلا یک متد کلا چندبار صدا زده شده و هر متد چقدر به طول انجامیده (در قالب یک Timeline کامل) و ....
🔹 قابلیت ثبت تمام کوئری های اجرا شده بر روی دیتابیس
توسط این قابلیت میشه دید چه کوئری هایی و مثلا یک کوئری چندبار روی دیتابیس اجرا شده و هرکدوم چقدر زمان بره و...
🔸 قابلیت ثبت تمام Exception های رخ داده به همراه جزئیات و stacktrace
🔹 قابلیت نمایش تمام Thread های ایجاد شده و فرایند های انجام شده داخلش هر کدومشون و یا کلیه فرایند های انجام شده داخل یک Process
🔸 قابلیت پروفایل کردن همه برنامه ها از جمله
.NET Framework, .NET Core و ASP.NET, ASP.NET Core, Webservices, WCF, Windows Forms, Windows services, WPF ,IIS Website, IIS Express Website, Attach to a running process
❇️ این قابلیت ها برای عیب یابی به شدت مفید هستند چون توی یه سیستم با تراکنش بالا که بعضی مشکلات رو نمیشه پیش بینی کرد با این به راحتی میشه متد ها و یا کوئری های سنگین و اضافه ای که باعث افت پرفرمنس میشه رو پیدا کرد
❇️ هر دو برنامه ANTS و dotTrace پولی بوده و جز بهترین و محبوبترین برنامه های Performance Profiler هستند.
برنامه dotTrace یکپارچگی خوبی با Resharper داره و Visual Studio داره ولی شخصا با توجه به تجربه کاری با جفتشون، برنامه ANTS رو بیشتر می پسندم؛ کارکردن باهاش راحته و UX خوبی داره گزارشات و خروجی کاربردی تری نشون میده
ANTS Performance Profiler overview (ویدئو دمو برنامه)
https://www.youtube.com/watch?v=8mhC-Ji6-uU
❇️ برنامه PerfView هم تقریبا همین قابلیت ها رو داره ولی کارکردن باهاش سخت تره و UX خوبی نداره ولی چون رایگانه محبوبه
برنامه CodeTrack هم قابلیت هاش (نسبت به قبلی ها) کمتره ولی کارکردن باهاش راحته و UX متوسطی داره ونیز رایگانه
❇️ یه قابلیت خوبی که فقط dotTrace داره قابلیت Remote Profiling هست که توسط اون میتونین به برنامه هاتون روی یه سرور Remote دیگه متصل بشین و پرفایلش کنین
#Performance
____________________
@DotNetZoom
YouTube
ANTS Performance Profiler Overview | Redgate
ANTS Performance Profiler is a .NET profiler for desktop, ASP.NET, and ASP.NET MVC applications. Use ANTS Performance Profiler to profile your SQL
queries and see execution plans, find performance bottlenecks fast, get rich performance data, explore unfamiliar…
queries and see execution plans, find performance bottlenecks fast, get rich performance data, explore unfamiliar…
✅معرفی کتابخانه EFCore.BulkExtensions
در سری #معرفی_اکستنشن_های_کاربردی_EFCore
Entity Framework Core Bulk Batch Extensions for Insert Update Delete and Read (CRUD) operations on SQL Server
خیلی وقتا نیاز میشه یک مرتبه حجم زیادی از رکورد ها رو توسط EFCore ذخیره کنین (مثلا import کردن از یه فایل excel)
در حالت عادی (متد Add و یا AddRange)، رکورد های شما به صورت تکی Insert میشه و سرعت بالایی نداره، بر خلافش اما، در روش Bulk Insert، همه رکورد ها به صورت یکجا Insert میشن و سرعت بسیار بسیار بالایی داره این روش (حتی تا 20 برابر سریع تر!)
این کتابخونه بی نظیر، قابلیت انجام عملیات Bulk و Batch رو در EF Core فراهم میکنه و از async هم پیشتیبانی میکنه :
- Bulk operations (Insert, Update, Delete, Read, Upsert, Sync)
- Batch operations (Delete, Update)
* برای مقایسه پرفرمنس و تفاوت سرعت بین روش عادی و Bulk هم تصویر پست گویای همه چی هست
لینک ریپازیتوری + مثال و توضیحات :
https://github.com/borisdj/EFCore.BulkExtensions
#Bulk #EFCore #Performance
___________________
@DotNetZoom
در سری #معرفی_اکستنشن_های_کاربردی_EFCore
Entity Framework Core Bulk Batch Extensions for Insert Update Delete and Read (CRUD) operations on SQL Server
خیلی وقتا نیاز میشه یک مرتبه حجم زیادی از رکورد ها رو توسط EFCore ذخیره کنین (مثلا import کردن از یه فایل excel)
در حالت عادی (متد Add و یا AddRange)، رکورد های شما به صورت تکی Insert میشه و سرعت بالایی نداره، بر خلافش اما، در روش Bulk Insert، همه رکورد ها به صورت یکجا Insert میشن و سرعت بسیار بسیار بالایی داره این روش (حتی تا 20 برابر سریع تر!)
این کتابخونه بی نظیر، قابلیت انجام عملیات Bulk و Batch رو در EF Core فراهم میکنه و از async هم پیشتیبانی میکنه :
- Bulk operations (Insert, Update, Delete, Read, Upsert, Sync)
- Batch operations (Delete, Update)
* برای مقایسه پرفرمنس و تفاوت سرعت بین روش عادی و Bulk هم تصویر پست گویای همه چی هست
لینک ریپازیتوری + مثال و توضیحات :
https://github.com/borisdj/EFCore.BulkExtensions
#Bulk #EFCore #Performance
___________________
@DotNetZoom
✅ آخرت سرعت در عملیات Linq با کتابخانه LinqFaster !
این کتابخانه با استفاده از تکنولوژی SIMD (ساده بگم : پردازش برداری موازی و فوق سریع) و پردازش موازی با Multi-Threading اومده و متد های کمکی مشابه ایی نوشته که عملیات Linq رو با سرعت بالا و مصرف حافظه کمتر انجام میده.
فقط کافیه بنچمارک رو توی تصویر ببینین :)
LinqFaster
متدهای کمکی Linq با پرفرمنس بالا
https://www.nuget.org/packages/LinqFaster/
LinqFaster.SIMD
متدهای کمکی Linq با پرفرمنس بالا با استفاده از تکنولوژی SIMD
https://www.nuget.org/packages/LinqFaster.SIMD/
LinqFaster.Parallel
متدهای کمکی Linq با پرفرمنس بالا با استفاده از پردازش موازی/Multi-Threading
https://www.nuget.org/packages/LinqFaster.Parallel/
LinqFaster.SIMD.Parallel
متدهای کمکی Linq با پرفرمنس بالا با استفاده از تکنولوژی SIMD و پردازش موازی/Multi-Threading
https://www.nuget.org/packages/LinqFaster.SIMD.Parallel/
لینک ریپازیتوری :
https://github.com/jackmott/LinqFaster
#Linq #Performance
__________________
@DotNetZoom
این کتابخانه با استفاده از تکنولوژی SIMD (ساده بگم : پردازش برداری موازی و فوق سریع) و پردازش موازی با Multi-Threading اومده و متد های کمکی مشابه ایی نوشته که عملیات Linq رو با سرعت بالا و مصرف حافظه کمتر انجام میده.
فقط کافیه بنچمارک رو توی تصویر ببینین :)
LinqFaster
متدهای کمکی Linq با پرفرمنس بالا
https://www.nuget.org/packages/LinqFaster/
LinqFaster.SIMD
متدهای کمکی Linq با پرفرمنس بالا با استفاده از تکنولوژی SIMD
https://www.nuget.org/packages/LinqFaster.SIMD/
LinqFaster.Parallel
متدهای کمکی Linq با پرفرمنس بالا با استفاده از پردازش موازی/Multi-Threading
https://www.nuget.org/packages/LinqFaster.Parallel/
LinqFaster.SIMD.Parallel
متدهای کمکی Linq با پرفرمنس بالا با استفاده از تکنولوژی SIMD و پردازش موازی/Multi-Threading
https://www.nuget.org/packages/LinqFaster.SIMD.Parallel/
لینک ریپازیتوری :
https://github.com/jackmott/LinqFaster
#Linq #Performance
__________________
@DotNetZoom