Почему var.First () вызывает проблемы с производительностью? - PullRequest
2 голосов
/ 18 октября 2011

Я использую .NET 4.0 c #. Я только сегодня понял, что проблема производительности была частично вызвана этим:

var feuilleDeTemps =
    from fdt in context.FeuilleDeTemps.Include("FeuilleDeTempsJournees");
...
feuilleDeTemps.First().Property
feuilleDeTemps.First().Property
feuilleDeTemps.First().Property
feuilleDeTemps.First().Property
...
FeuilleDeTemps myFT = feuilleDeTemps.First();
return myFT;

Я использовал первый элемент feuilleDeTemps (примерно 4 раза на цикл x 60 циклов) перед тем, как установить его в обычную переменную, подобную этой:

FeuilleDeTemps myFT = feuilleDeTemps.First();

Тогда я понял, что это вызывает проблемы с производительностью. Я использовал это вместо:

var feuilleDeTemps =
    from fdt in context.FeuilleDeTemps.Include("FeuilleDeTempsJournees");
FeuilleDeTemps myFT = feuilleDeTemps.First();
...
myFT.Property
myFT.Property
myFT.Property
myFT.Property
...
return myFT;

Я использовал feuilleDeTemps.First (). Свойство около 240 раз. Теперь я использую его 60 раз, и 240 использований свойства идут напрямую через типизированную переменную. Это заставило мой код выполнять в 2 раза меньше времени (3 секунды против 6 секунд, что все еще довольно медленно) ...

Почему?

Ответы [ 2 ]

4 голосов
/ 18 октября 2011

Вы касаетесь базы данных четыре раза по первому коду.

Второй касается базы данных один раз , и после этой строки доступны данные.

Вот так ролл Entity Framwork, человек: D

4 голосов
/ 18 октября 2011

Запрос, который вы сохранили в feuilleDeTemps, фактически не выполняется, пока вы не запросите значение. В вашем случае это происходит, когда вы звоните First. Генерация объекта запроса обычно очень быстрая. Это выполнение запроса, которое обычно занимает больше всего времени. В вашем примере вы выполняете один и тот же запрос несколько раз, что приводит к нескольким обращениям к базе данных.

При использовании LINQ важно помнить, что существует разница между запросом и результатами этого запроса. Обычно запросы выполняются лениво - данные не извлекаются, пока вы их не запросите, например, с First, ToList, foreach (var result in query) и т. д.

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