AsQueriable () или выражение <T>.Compile ()? - PullRequest
0 голосов
/ 30 октября 2009

Edit2:
После того, как я наконец смог профилировать их друг против друга, кажется, что в моей ситуации .AsQueryable () немного быстрее, чем Expression.Compile ().

Оригинальный вопрос:
Я реализовал кеш некоторых таблиц базы данных (например, List<T>), которые мне нужно запрашивать с тем же Expression<Func<T, bool>>, который я использовал бы при запросе к самому Table<T>.

Какой самый быстрый / лучший способ из них:

List<T>.AsQueryable().FirstOrDefault(Expression<Func<T, bool>>)

или

List<T>.FirstOrDefault(Expression<Func<T, bool>>.Compile())

Edit: Изменено Где на FirstOrDefault, так как это метод, который я использую. Думаю, я немного устал, когда писал вопрос. Будет ли FirstOrDefault проверять каждый элемент, например «Где», или он останавливается при первом попадании (если есть)?

Ответы [ 3 ]

1 голос
/ 30 октября 2009

Почему второй угадать это? Заполните его с вашими данными и посмотрите, что работает лучше всего.

1 голос
/ 30 октября 2009

Как всегда, лучший способ определить, что быстрее, это попробовать:

Фильтрация списка <> с использованием простого Где всегда приводит к тому, что каждый элемент проверяется один раз. Без дополнительных предположений, таких как ваш список, отсортированный в определенном порядке, другого пути на самом деле нет, то есть две версии, которые вы дадите, приведут к точно таким же оценкам вашего выражения.

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

Редактировать: Прохождение Queryable может возможно быть быстрее для выражений, которые на самом деле не зависят ни от какого ввода, например () => false.

1 голос
/ 30 октября 2009

Зависит от того, сколько операций вы собираетесь выполнить, и от интенсивности процессора при выполнении вашего выражения.

Вы можете легко проверить это с помощью секундомера или другого диагностического компонента.

...