عنوان:

‫نگاهی به کیفیت LinkedIn Tips


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۲/۱۷ ۱۱:۳۷
آدرس: www.dntips.ir
مقدمه
بهینه‌سازی عملکرد یکی از جنبه‌های حیاتی در توسعه نرم‌افزار، به ویژه در برنامه‌های کاربردی است که با حجم زیادی از داده‌ها سروکار دارند. انتخاب روش‌های نادرست در دسترسی و پردازش داده‌ها می‌تواند منجر به کاهش چشمگیر سرعت و افزایش بار سرور شود. اخیراً، مطلبی در لینکدین (LinkedIn) منتشر شده است که به ظاهر به ارائه راهکارهایی برای بهبود عملکرد در کار با مجموعه‌های بزرگ داده در دات‌نت می‌پردازد. با این حال، بررسی دقیق‌تر نشان می‌دهد که رویکردهای مطرح شده در آن پست، نه تنها کمکی به بهینه‌سازی نمی‌کنند، بلکه می‌توانند منجر به مشکلات جدی در عملکرد برنامه شوند. در این مقاله آموزشی، ضمن بررسی این رویکردهای نادرست، راهکار صحیح برای دسترسی کارآمد به داده‌ها در برنامه‌های دات‌نت را ارائه خواهیم داد.

بررسی رویکردهای نادرست مطرح شده
در پست لینکدین مورد اشاره، دو قطعه کد سی‌شارپ (#C) برای دسترسی به اطلاعات کاربران از یک پایگاه داده با استفاده از چارچوب Entity Framework مقایسه شده است. ادعا شده است که قطعه کد دوم، به دلیل استفاده از متد AsEnumerable()، عملکرد بهتری نسبت به قطعه کد اول که از متد ToList() استفاده می‌کند، دارد.

قطعه کد اول (به زعم نویسنده لینکدین، کندتر):
var users = context.Users.ToList().Where(u => u.IsActive);
در این قطعه کد، ابتدا تمامی رکوردهای جدول Users از پایگاه داده به حافظه کلاینت (Client) منتقل شده و به صورت یک لیست (List<User>) در می‌آیند. سپس، متد Where() بر روی این لیستِ درون حافظه اجرا شده و کاربرانی که ویژگی IsActive آن‌ها true است، فیلتر می‌شوند. واضح است که این روش، به خصوص در مواجهه با جداول بزرگ، بسیار ناکارآمد است زیرا حجم زیادی از داده‌های غیرضروری به حافظه منتقل شده و سربار زیادی را ایجاد می‌کند.

قطعه کد دوم (به زعم نویسنده لینکدین، سریع‌تر):
var users = context.Users.AsEnumerable().Where(u => u.IsActive);
نویسنده پست لینکدین ادعا می‌کند که این قطعه کد به دلیل استفاده از AsEnumerable() و بازگرداندن IEnumerable<User>، عملکرد بهتری دارد. درک نادرست اینجاست که متد AsEnumerable() در چارچوب Entity Framework، اجرای کوئری (Query) را از سطح پایگاه داده به سطح کلاینت منتقل می‌کند. به عبارت دیگر، با فراخوانی AsEnumerable()، شما به Entity Framework می‌گویید که هرگونه عملیات LINQ (Language Integrated Query) که پس از آن می‌آید، باید در حافظه برنامه شما (کلاینت) اجرا شود، نه در پایگاه داده (سرور). در نتیجه، حتی با وجود اینکه نوع بازگشتی IEnumerable<User> است و ممکن است تا زمان نیاز واقعی به داده‌ها، عمل واکشی به تعویق بیفتد (Deferred Execution)، باز هم کل جدول Users به حافظه کلاینت منتقل خواهد شد تا فیلتر Where() روی آن اعمال شود.
همانطور که نویسنده مقاله اصلی نیز اشاره می‌کند، تفاوت جزئی بین این دو قطعه کد در نوع بازگشتی آن‌هاست (List<User> در مقابل IEnumerable<User>). از آنجایی که IEnumerable یک مجموعه رو به جلو (Forward-Only Collection) است، ممکن است در سناریوهای خاص و تا قبل از فراخوانی متدهایی مانند ToList() یا تکرار کامل آن، مقدار کمی سربار اولیه کمتری داشته باشد. با این حال، در یک برنامه کاربردی ASP.NET Core، هنگام تلاش برای نمایش یا استفاده از این IEnumerable، چارچوب به طور خودکار آن را Materialize (تبدیل به یک مجموعه قابل استفاده) می‌کند و در نتیجه، همان مشکل انتقال کل داده‌ها به حافظه رخ خواهد داد.

راهکار صحیح برای فیلتر کردن داده‌ها در سطح پایگاه داده
روش صحیح و کارآمد برای فیلتر کردن داده‌ها در برنامه‌های دات‌نت که از Entity Framework استفاده می‌کنند، اعمال فیلترها در سطح کوئری و قبل از واکشی داده‌ها از پایگاه داده است. این کار با استفاده از متد Where() قبل از فراخوانی متدهایی مانند ToList() یا ToArray() انجام می‌شود.
قطعه کد صحیح:
var users = context.Users.Where(u => u.IsActive).ToList();
در این قطعه کد، شرط u => u.IsActive به عنوان بخشی از کوئری SQL (Structured Query Language) به پایگاه داده ارسال می‌شود. پایگاه داده تنها رکوردهایی را برمی‌گرداند که این شرط را برآورده می‌کنند. در نتیجه، حجم داده‌های منتقل شده به حافظه کلاینت به حداقل رسیده و عملکرد برنامه به طور قابل توجهی بهبود می‌یابد، به خصوص در کار با جداول بزرگ.

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

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


مشاهده مطلب اصلی