Сравнение производительности Plinq и linq c # - PullRequest
0 голосов
/ 27 октября 2019

Может ли кто-нибудь объяснить мне, почему PLinq лучше обычного linq в первом примере, но хуже во втором? Я вижу, что единственное отличие - Thread.Sleep () в функции ExорогоComputation ()

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;

namespace PlinqTest
{
    public class Employee
    {
        public string Name { get; set; }
        public double Salary { get; set; }
        public bool ExpensiveComputation()
        {
            Thread.Sleep(10);
            return (Salary > 2000 && Salary < 3000);
        }
        public bool NonExpensiveComputation()
        {
            return (Salary > 2000 && Salary < 3000);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<Employee> employeeList = GetData();
            Stopwatch stopWatch = new Stopwatch();

            // Example 1

            stopWatch.Start();
            var linqResult = employeeList.Where<Employee>(e => e.ExpensiveComputation());
            int empCount = linqResult.Count();
            stopWatch.Stop();
            Console.WriteLine(string.Format("Time taken by old LINQ in Expensive Computation is {0} to get {1} Employees", stopWatch.Elapsed.TotalMilliseconds, empCount));
            stopWatch.Reset();
            stopWatch.Start();
            linqResult = employeeList.AsParallel<Employee>().Where<Employee>(e => e.ExpensiveComputation());
            empCount = linqResult.Count();
            stopWatch.Stop();
            Console.WriteLine(string.Format("Time taken by new PLINQ in Expensive Computation is {0} to get {1} Employees", stopWatch.Elapsed.TotalMilliseconds, empCount));
            stopWatch.Reset();
            Console.WriteLine();

            // Example 2

            stopWatch.Start();
            linqResult = employeeList.Where<Employee>(e => e.NonExpensiveComputation());
            empCount = linqResult.Count();
            stopWatch.Stop();
            Console.WriteLine(string.Format("Time taken by old LINQ in Non Expensive Computation is {0} to get {1} Employees", stopWatch.Elapsed.TotalMilliseconds, empCount));
            stopWatch.Reset();
            stopWatch.Start();
            linqResult = employeeList.AsParallel<Employee>().Where<Employee>(e => e.NonExpensiveComputation());
            empCount = linqResult.Count();
            stopWatch.Stop();
            Console.WriteLine(string.Format("Time taken by new PLINQ in Non Expensive Computation is {0} to get {1} Employees", stopWatch.Elapsed.TotalMilliseconds, empCount));
            stopWatch.Reset();
            Console.ReadKey();
        }

        static List<Employee> GetData()
        {
            List<Employee> employeeList = new List<Employee>();
            Random random = new Random(1000);
            for (int i = 0; i < 500; i++)
            {
                employeeList.Add(new Employee() { Name = "Employee" + i, Salary = GetRandomNumber(random, 1000, 5000) });
            }
            return employeeList;
        }
        static double GetRandomNumber(Random random, double minimum, double maximum)
        {
            return random.NextDouble() * (maximum - minimum) + minimum;
        }
    }
}

Вот результат:

Время, затраченное старым LINQ в дорогих вычислениях, равно 5458.0269 для получения 135 сотрудников

Время, необходимое новому PLINQ для дорогих вычислений, составляет 741.835 для получения 135 сотрудников

Время, необходимое старому LINQ для недорогих вычисленийсоставляет 0,3653 , чтобы получить 135 сотрудников

Время, затраченное новым PLINQ в не дорогих вычислениях, составляет 0,9175 , чтобы получить 135 сотрудников

1 Ответ

0 голосов
/ 27 октября 2019

Параллелизм не является бесплатным, он требует дополнительных затрат. Если объем выполняемой вами работы очень мал, то накладные расходы могут быть больше, чем экономия времени, которую вы получаете.

Я настоятельно рекомендую прочитать бесплатную электронную книгу Образцы параллельного программирования ,он говорит о проблемах, подобных тем, которые у вас есть, и довольно хорошо их объясняет.

...