2010-08-09 3 views
7

Я повторяю анонимный тип с примерно 1000 элементами.linq foreach performance

Вопрос в том, как возможно, что моя петля занимает почти 3 секунды, а то, что происходит внутри циклов, занимает менее 1 мс. С тысячей элементов, которые фигурируют, цикл должен заканчиваться во втором, а не 3.

Есть ли способ ускорить его итерацию?

// takes 1ms to complete 
     var x = tt.Where(p => p.Methods.Count() > 0 && p.PerWeek != this.Project.WorkDaysCount && !p.IsManual); 

// takes almost 3 seconds to complete 
        foreach (var item in x) 
        { 
         // do stuff that takes < 1 ms 
        } 

ответ

14

Linq использует отложенное исполнение. Ваш запрос linq фактически не выполняется, пока кто-то не использует возвращаемый IEnumerable. Время выполнения, которое вы видите, является результатом запроса, а не foreach.

+0

Ofcourse. Я не понимал. Благодарю. – Jeroen

7

Это отсроченное исполнение. напишите x.ToList();, и это займет ~ 3 секунды.

15

Два непосредственных предложения:

  • Не используйте p.Methods.Count() > 0 - что необходимо выполнить полный анализ, несмотря на то, что вам нужно только знать, если есть какие-либо элементы. Вместо этого используйте p.Methods.Any().
  • Не вычисляйте this.Project.WorkDaysCount на каждой итерации. Мы не знаем подробностей о том, что там происходит, но это может быть дорого. Предкоммутируйте его и используйте константу.

Вот усовершенствованный код запроса:

int workDaysCount = Project.WorkDaysCount; 
var x = tt.Where(p => p.Methods.Any() && 
       p.PerWeek != workDaysCount && 
       !p.IsManual); 

Как уже говорилось, причина сама конструкция запроса не принимает каких-либо значительных затрат времени является то, что вот оно не делает никакой реальной работы. Однако, зная, что это не ускорится, конечно :)

Помимо этого, нам нужно будет узнать больше об этом контексте. Является ли это LINQ для объектов, LINQ to SQL или что-то еще? Какой тип tt?

+0

Это часть довольно сложного модуля. tt является результатом группы и строит субсбор. Методы основаны на некоторых критериях. Это линк для объектов. Основываясь на вашей информации, я думаю, что могу оптимизировать ее дальше. Благодаря! – Jeroen

1

Ваш IEnumerable (x) не будет оцениваться до тех пор, пока вы не материализуете его.