Параллельная коллекция Linq to Object - PullRequest
1 голос
/ 05 января 2012

У меня возник основной вопрос, когда я пытался использовать Plinq (Parallel linq) для сбора объектов, и я заметил, что обычная работа Plinq V не сильно отличается по времени выполнения.Кто-нибудь может проверить мой код и посоветовать, почему так происходит.Я запустил этот код в процессоре i7.

class Program
{
    static void Main(string[] args)
    {
        new Program().Plinq();
        new Program().linq();
        Console.ReadLine();
    }

    void Plinq()
    {

        DateTime startTime = DateTime.Now;

        var query1 = (from port in new XpressEntities().Portfolios.Take(1000000)
                      select new port { PortId = port.PORT_ID, CFAC = port.CFAC }).ToList<port>();

        query1.AsParallel().Where(e => e.PortId == 0);
        TimeSpan ts = DateTime.Now.Subtract(startTime);
        Console.WriteLine("Time Elapsed: {0} Seconds:MilliSeconds in Paralel mode", ts.Seconds + ":" + ts.Milliseconds);

    }

    void linq()
    {

        DateTime startTime = DateTime.Now;

        var query1 = (from port in new XpressEntities().Portfolios.Take(1000000)
                      select new port { PortId = port.PORT_ID, CFAC = port.CFAC }).ToList<port>();

        query1.Where(e => e.PortId == 0);
        TimeSpan ts = DateTime.Now.Subtract(startTime);
        Console.WriteLine("Time Elapsed: {0} Seconds:MilliSeconds in Normal mode", ts.Seconds + ":" + ts.Milliseconds);

    }

}
class port
{
    public int PortId { get; set; }
    public string CFAC { get; set; }
}

Результат приведенного выше кода составляет

Время истекло: 6: 411 секунды: миллисекунды в режиме Paralel


Истекшее время: 6:68 секунды: миллисекунды в нормальном режиме

1 Ответ

1 голос
/ 02 февраля 2012
  • Где () возвращает IEnumerable и не приводит к оценке запроса.Вам необходимо подробно оценить ответ (например, с помощью ToList ()).

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

  • Используйте класс System.Diagnostics.Stopwatch для своих измерений;у него гораздо лучшая точность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...