سؤال

ولا يبدو للقيام القرفصاء لبرنامج الاختبار التالي. وهذا لأنني اختبار مع قائمة صغيرة؟

static void Main(string[] args)
{
    List<int> list = 0.UpTo(4);

    Test(list.AsParallel());
    Test(list);
}

private static void Test(IEnumerable<int> input)
{
    var timer = new Stopwatch();
    timer.Start();
    var size = input.Count();
    if (input.Where(IsOdd).Count() != size / 2)
        throw new Exception("Failed to count the odds");

    timer.Stop();
    Console.WriteLine("Tested " + size + " numbers in " + timer.Elapsed.TotalSeconds + " seconds");
}

private static bool IsOdd(int n)
{
    Thread.Sleep(1000);
    return n%2 == 1;
}

وكلا الإصدارين تأخذ 4 ثوان للتشغيل.

هل كانت مفيدة؟

المحلول

والعمل بالتوازي مكتبة يهتم <م> نوع ثابت من التسلسل. يجب IParallelEnumerable<T> ذلك لعمليات ليتم التعامل معها من قبل TPL. كنت الصب جمع إلى IEnumerable<T> عند استدعاء Test. ولذلك، فإن المترجم حل دعوة .Where على تسلسل لSystem.Linq.Enumerable.Where طريقة تمديد بدلا من نص مواز التي تقدمها TPL.

نصائح أخرى

و(تحديث ل.NET4 منذ هذا السؤال الرتب العالية جدا في جوجل للبحث عن AsParallel ())

سوف

وعلى بعد بضعة تغييرات تسمح المثال الخاص للعمل كما أتصور هو متوقع.

تغيير List<int> list = 0.UpTo(4); إلى var list = Enumerable.Range(0, 4);

وومثال ما تبذلونه من العمل إذا قمت بإضافة الزائد وظيفة مع التوقيع الذي يأخذ ParallelQuery ...

    private static void Test(ParallelQuery<int> input)
    {
        var timer = new Stopwatch();
        timer.Start();

        int size = input.Count();
        if (input.Where(IsOdd).Count() != size / 2)
        {
            throw new Exception("Failed to count the odds");
        }
        timer.Stop();

        Console.WriteLine("Tested " + size + " numbers in " + timer.Elapsed.TotalSeconds + " seconds");
    }

وبدلا من ذلك، يمكنك استخدام جملة LINQ ....

    private static void Test(ParallelQuery<int> list)
    {
        var timer = Stopwatch.StartNew();

        if ((from n in list.AsParallel()
             where IsOdd(n)
             select n).Count() != (list.Count() / 2))
        {
            throw new Exception("Failed to count the odds");
        }

        Console.WriteLine("Tested " + list.Count() + " numbers in " + timer.Elapsed.TotalSeconds + " seconds");
    }

ويساعد هذا الأمل شخص!

وكما يعمل بالتوازي عن طريق وضع الأشياء الخاصة بك في ThreadPool. أيضا، وكم النوى لديك؟ إذا كنت تعمل على جهاز الأساسية واحدة من شأنها أن لا تزال تأخذ حوالي 4S لتشغيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top