Разница в производительности между `is` и` as` в LINQ - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть две версии селектора LINQ, который выполняет некоторую фильтрацию неуниверсальных типов и возвращает универсальное перечисление.Предположим, что мы полностью перечислим оба с одним и тем же параметром source, интересно, какая версия будет более производительной:

public static IEnumerable<ICollection<TData>> OfType1<TData>(this IEnumerable<ICollection> source) =>
    source
        .Select(c => c as ICollection<TData>)
        .Where(c => !(c is null));

public static IEnumerable<ICollection<TData>> OfType2<TData>(this IEnumerable<ICollection> source) =>
    source
        .Where(c => c is ICollection<TData>)
        .Select(c => c as ICollection<TData>);

На мой взгляд, все сводится к разнице между is и asпоскольку в OfType2 мы фильтруем первый (не последний) и, следовательно, можем сделать меньше второго оператора.В первом случае нам нужно выполнить обе операции над всеми элементами перечисляемого.

Так что же на самом деле лучше всего работает здесь?А чем отличаются is и as под капотом?(Ссылки на исходный код приветствуются!)

1 Ответ

0 голосов
/ 24 декабря 2018

Вам действительно нужно протестировать это самостоятельно, поскольку реализации могут измениться.

Однако ваш нынешний подход немного расточителен.OfType будет более производительным, более прямым и менее распределенным.

Как вы можете видеть из реализации, она просто использует is и yield, что в любом случае является своего рода духом вашего метода расширения

public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source) {
    if (source == null) throw Error.ArgumentNull("source");
    return OfTypeIterator<TResult>(source);
}
static IEnumerable<TResult> OfTypeIterator<TResult>(IEnumerable source) {
    foreach (object obj in source) {
        if (obj is TResult) yield return (TResult)obj;
    }
}

Дополнительные ресурсы

Метод Enumerable.OfType (IEnumerable)

Фильтрует элементы IEnumerable на основе указанного типа.

Исходный код OfType

Benchmark.Net

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