2012-01-05 3 views
1

У меня возник вопрос, когда я попытался с помощью Plinq (Parallel linq) в сборке объектов, и я заметил, что нормальная работа Plinq Vs не имеет большого значения с точки зрения времени выполнения. Может кто-нибудь может проверить мой код и посоветовать мне, почему так происходит. Я запустил этот код в процессоре i7.Параллельный набор Linq to Object

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 секунд: миллисекунды в Нормальный режим

+2

Я ожидаю, что большая часть вашего времени находится в назначении 'var query1', который идентичен для обоих. –

+0

Это правильно. Вы должны измерять только «Where» (используйте класс секундомера) –

ответ

1
  • Где() возвращает IEnumerable и не приводит к вычислению запроса. Вы должны объяснить результат ответа (например, используя ToList()).

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^