Запросы LINQ to Entites 4.0 компилируются по умолчанию? - PullRequest
5 голосов
/ 25 июня 2010

Я только недавно начал ежедневно использовать LINQ.Я много читал о том, что запросы L2E должны быть скомпилированы для повышения производительности с использованием следующего:

CompiledQuery.Compile(query);

Использование LINQ-To-Entities 4.0 Я 10 раз выполнял запрос без компиляции изатем скомпилировал и выдал следующие результаты в считанные секунды:

// Sample Query
from u in ctx.Users orderby u.Id, u.Username select u

Uncompiled  Compiled
---------------------
0.295       0.2946174
0.024       0.0220462
0.008       0.0060126
0.013       0.0210441
0.007       0.010021
0.011       0.010021
0.008       0.0060126
0.009       0.0070147
0.008       0.0060126

Как вы можете заметить, разница во времени с моим небольшим тестом не очень велика.Время первого вызова медленнее, а затем оба ускоряются (что подразумевает компиляцию / кэширование).Кто-нибудь может дать представление об этом?

Ответы [ 2 ]

1 голос
/ 26 июня 2010

Из того, что я могу извлечь, он имеет примерно то же преимущество, что жестко запрограммированные SQL-запросы со встроенными параметрами к SQL-запросам с использованием именованных параметров: система может распознать, что они все одинаковые и используют один и тот же план запросов. 1001 *

Например, если вы просто вставите вышеприведенное выражение, оно, вероятно, будет работать так же хорошо, как и компиляция, если вы всегда передаете один и тот же объект ctx.Users. Однако если у вас есть несколько пользовательских репозиториев одного типа и вы планируете использовать этот order by на всех из них, было бы неплохо скомпилировать запрос один раз и использовать параметры для доступа к нему.

Исследуя это, я взглянул на то, как формируется запрос LINQ в IL: новый делегат Func<> создается почти для каждого предложения в вашем запросе LINQ каждый раз, когда вы его вызываете. Только по этой причине, я полагаю, что компиляция запроса будет лучше для вашей системы, поскольку перегрузка памяти идет.

0 голосов
/ 26 июня 2010

Вы, вероятно, не избавляетесь от контекста. Запросы кэшируются в контексте, но их компиляция позволяет использовать их в разных контекстах. Трудно сказать наверняка, так как вы фактически не показываете свой полный код.

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