PDA

View Full Version : سوال: سرعت پایین EntityFramework در برابر ADO.NET



LostOfMind
سه شنبه 30 تیر 1394, 18:07 عصر
سلام من از ADO.NET مایکروسافت استفاده میکردم در واقع از SqlDataAdapter و این کلاس ها
تازگی با EntityFramwork آشنا شدم و تا حدی ازش استفاده کردم
سئوالی که دارم اینه که چرا سرعت ذخیره و بازیابی اطلاعات با استفاده از EntityFramework نسبت به نسخه قبلیش پایینه؟
آیا راهی برای افزایش سرعت انتقال اطلاعات وجود داره؟

SabaSabouhi
سه شنبه 30 تیر 1394, 18:11 عصر
سلام من از ADO.NET مایکروسافت استفاده میکردم در واقع از SqlDataAdapter و این کلاس ها
تازگی با EntityFramwork آشنا شدم و تا حدی ازش استفاده کردم
سئوالی که دارم اینه که چرا سرعت ذخیره و بازیابی اطلاعات با استفاده از EntityFramework نسبت به نسخه قبلیش پایینه؟
آیا راهی برای افزایش سرعت انتقال اطلاعات وجود داره؟

سلام
دلیلش خیلی پیچیده نیست، وقتی کد سطح بالا نوشته می‌شه طبیعی هست که سرعتش از کد سطح پایین کند‌تر باشه.
خود EF از Ado.Net استفاده می‌کنه و به نوعی یک پوسته روی اون کشیده که کار برنامه نویسی رو راحت‌تر کنه.
امکانات و امتیازهای EF به نظر من کندتر بودن رو پوشش می‌ده. البته راه‌کارهایی هست که سرعت رو زیاد می‌کنه
و باید از EF درست استفاده کنی تا این کندی خیلی به چشم نیاد.
مثلاً تابع ()ToList حتماً باید دیرترین زمان فراخوانی بشه تا حجم داده‌ی کمتری بین سرور و نرم‌افزار شما جابجا بشه، ضمن این که
شما می‌تونی با استفاده از Profiler دقیقاً ببینی که چه کدی به سمت Sql Server ارسال می‌شه و کد رو طوری بنویسی که
بهینه‌ترین کد ایجاد بشه.

صبا صبوحی

ali_md110
جمعه 02 مرداد 1394, 13:00 عصر
عبارات لامیدا هنگام ارسال به بانک برنامه تبدیل به کدهای استاندارد t sql میشه و این خودش یک مزیت هست
بعضی وقتا حتی سریعتر از روش قدیمی
منم موافقم با اقای صبوحی
یک برنامه profiler نصب کنید یکیشون که کار باهاش راحته و مجانی هست:
https://www.nuget.org/packages/EFlogger-For6/
برنامه پروفایلر میاد تعداد کوئریهایی که به بانک شما ارسال میشه از طرف برنامه زیر نظر میگیره
بعضی وقتا یک عبارت لامبدا مینویسید و هنگام اجرای برنامه تبدیل میشه به دستور اسکیول وارسال میشه سمت بانک برنامه وقتی پروفایلر رو نگاه میکنید میبینید مثل بمپ چند بار ارسال شده و این خودش خیلی زمان بر هست و دلیلش یکی کاربرد نابهنگام Lazy Loading هست که میتونید بجاش از eager loading استفاده کنید و اینکه join های اضافی توی دستور مشاهده میشه

یکی دیگه از کارهایی که میتونید سرعت برنامه بالا ببرید استفاده از الگوی تزریق وابستگی Dependency Injection patterns هست » کارش اینه که میاد نیازمندیهای کلاسها یا برنامه ما برو به موقع در اختیارش قرار میده تا بی خودی یک سری منابع هدر نره مانند وهله سازی بی خودی و نابهنگام از یک شی
راه دیگه بکارگیری Auto mapper یا projection هست-کارشون اینه که وقتی یک کوئری ساده روی مدل یا جدول بزرگ برنامه زده میشه تمام فیلدها توی کوئری در نظر گرفته میشه و میتونیم از این طریق تعداد فیلدها رو به حداقل لازم برسونیم
تاجاییکه امکان داره سمت مدلهاتون از ارث بری کمتر استفاده کنید مخصوصا Tpt که البته نوع مناست ارث بری همین هست
ولی نوعی دیگه از ارث بری که سرعت بیشتری داره tph هست
از پترن UnitOfwork هم استفاده کنید خوبه
سمت کدهای مدل برنامه از اندیس گذاری استفاده کنید مخصوصا فیلدهایی که روش زیاد حستجو میزنید
میتونید از کوئریهای کامپایل شده هم استفاده کنید
راههای مختلفی برای بالا بردن سرعت هست
این یک لینک برای مطالعه:
https://www.talksharp.com/increase-enity-framework-performance