نکاتی درباره پرس و جو با استفاده از پردازش موازی
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: دو دقیقه

برای انجام عملیات  پرس و جوی LINQ با استفاده از روش پردازش موازی به راحتی میتوان الحاقیه AsParallel را به هر داده‌ای از نوع IEnumerable<T> افزود: 

var data = 
new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// پرس و جوی عادی
var q1 = from i in data select i;
// پرس و جو به شیوه موازی
var q2 = from i in data.AsParallel() select i;

الحاقیه .AsParallel() در پرس و جویq2  نسخه موازی LINQ  را بر روی متغیر data  اجرا میکند و اگر همه چیز به صورت صحیح انجام شود هر دو پرس و جو باید نتایج یکسانی داشته باشند، اما نتایج عبارتند از :

//نتیجه اجرای q1
0 1 2 3 4 5 6 7 8 9 10
//نتیجه اجرای q2
0 6 1 7 2 8 3 9 4 10 5

همانطور که ملاحظه میکنید ترتیب واقعی نتایج اجرای پرس و جوها با یکدیگر متفاوت‌اند و نکته جالبتر آنکه با هر بار اجرای برنامه نتیجه اجرای پرس و جوی q2   با نتیجه سری قبل خودش متفاوت است که این تفاوت به چگونگی تقسیم بندی انجام کار میان هسته‌های سی پی یو، بستگی دارد. نکته بسیار مهم آن است که عملیات پردازش موازی خود را ملزم به حفظ ترتیب داده‌ها نمی‌داند مگر آنکه مجبورش کنیم  و این رفتار پردازش موازی به دلیل بالا بردن راندمان عملیات است در نتیجه انجام پرس و جوهای  موازی توسط الحاقیه .AsParallel() خیلی هم ساده نیست و ممکن است منجر به تولید نتایج ناخواسته شود.

حال اگر چگونگی ترتیب داده‌ها، برایمان مهم است به دو روش می‌توانیم آن را انجام دهیم:

1- افزودن عبارت orderby به پرس و جو

2- استفاده از الحاقیه AsOrdered 

var q3 = from i in data.AsParallel() orderby i  select i;

var q4 = from i in data.AsParallel().AsOrdered() select i;

که نتیجه انجام هر دو پرس و جوی بالا یکی خواهد بود. حال مسأله دیگر این است که آیا همیشه استفاده از پردازش موازی مفید خواهد بود یا خیر؟پاسخ این سؤال وابسته است به نوع مسأله و حجم داده مورد نظر و مشخصات سیستمی که قرار است از آن کد استفاده کند. چگونگی اندازه سرعت و مقدار مصرف حافظه در اجرای چهار پرس و جوی فوق  در کامپیوتر من با پردازنده Intel Q9550 به شکل زیر است:

نتیجه تست پرس و جوی موازی

  • #
    ‫۹ سال و ۱۲ ماه قبل، چهارشنبه ۱۶ مهر ۱۳۹۳، ساعت ۱۳:۵۹
    سلام میشه لطفا دستوری که میزان حافظه و زمان پرس و جو‌های بالا را برمی گرداند را در سایت قرار دهید
    • #
      ‫۹ سال و ۱۲ ماه قبل، چهارشنبه ۱۶ مهر ۱۳۹۳، ساعت ۱۶:۰۶
      کلاس مورد نظر در این مقاله قرار دارد
          public class PerformanceHelper
          {
              public static string RunActionMeasurePerformance(Action action)
              {
                  GC.Collect();
                  long initMemUsage = Process.GetCurrentProcess().WorkingSet64;
       
                  var stopwatch = new Stopwatch();
                  stopwatch.Start();
       
                  action();
       
                  stopwatch.Stop();
       
                  var currentMemUsage = Process.GetCurrentProcess().WorkingSet64;
                  var memUsage = currentMemUsage - initMemUsage;
                  if (memUsage < 0) memUsage = 0;
       
                  return string.Format("Elapsed time: {0}, Memory Usage: {1:N2} KB", stopwatch.Elapsed, memUsage / 1024);
              }
          }