C# FindAll VS, где скорость

Любой знает любую разность оборотов между Где и FindAll в Списке. Я знаю, Где часть IEnumerable и FindAll, часть Списка, мне просто любопытно, что быстрее.

35
задан Dested 14 February 2010 в 05:23
поделиться

4 ответа

Метод FindAll класса List фактически создает новый объект списка и добавляет к нему результаты. Метод расширения Where для IEnumerable будет просто перебирать существующий список и давать перечисление результатов сопоставления без создания или добавления чего-либо (кроме самого перечислителя).

При небольшом наборе два, вероятно, будут работать сравнительно. Однако, учитывая больший набор, Where должно превзойти FindAll, поскольку новый список, созданный для содержания результатов, должен будет динамически расти, чтобы содержать дополнительные результаты. Использование памяти FindAll также начнет экспоненциально расти по мере увеличения числа совпадающих результатов, при этом as Where должно иметь постоянное минимальное использование памяти (само по себе ... исключая все, что вы делаете с результатами).

{{1 }}
54
ответ дан 27 November 2019 в 07:02
поделиться

Где намного быстрее, чем FindAll . Независимо от того, насколько велик список, , где занимает точно такое же количество времени.

Конечно, Где просто создает запрос. На самом деле он ничего не делает, в отличие от FindAll , который создает список.

2
ответ дан 27 November 2019 в 07:02
поделиться

Это похоже на решение kvb, но не использует частичный активный образец.

let rec listToSeq convert (list:list<_>) =
    seq {
        if not(List.isEmpty list) then
            let list, vec = convert list
            yield vec
            yield! listToSeq convert list
        }

let vec2Seq = listToSeq (function
    | x::y::tail -> tail, Vector2(x,y)
    | _ -> failwith "float array not multiple of 2?")

let vec3Seq = listToSeq (function
    | x::y::z::tail -> tail, Vector3(x,y,z)
    | _ -> failwith "float array not multiple of 3?")
-121--2964752-

Метод FindAll класса List < T > фактически создает новый объект списка и добавляет к нему результаты. Метод расширения Where для IEnumerable < T > будет просто выполнять итерацию по существующему списку и давать перечисление совпадающих результатов, не создавая и не добавляя ничего (кроме самого перечислителя.)

Учитывая небольшой набор, эти два, вероятно, будут работать сопоставимо. Однако, учитывая больший набор, Where должен превосходить FindAll, так как новый список, созданный, чтобы содержать результаты, должен будет динамически расти, чтобы содержать дополнительные результаты. Использование памяти FindAll также начнет расти экспоненциально по мере увеличения числа совпадающих результатов, где как Where должно иметь постоянное минимальное использование памяти (само по себе... исключая все, что вы делаете с результатами.)

-121--1315530-

.FindAll () должен быть быстрее, он уже знает размер списка и закольцовывает внутренний массив с помощью простого цикла для . .Here () должен запустить перечислитель (запечатанный класс рамки, называемый Where Iterator в этом случае) и выполнить ту же работу менее конкретным способом.

Имейте в виду, что .Where () является перечисляемым, не активно создавая Список в памяти и заполняя его. Это больше похоже на поток, поэтому использование памяти на что-то очень большое может иметь значительную разницу. Кроме того, вы можете начать использовать результаты параллельным образом гораздо быстрее, используя там .Here () подход в 4.0.

4
ответ дан 27 November 2019 в 07:02
поделиться

Ответ от jrista имеет смысл. Однако новый список добавляет те же объекты, таким образом, только увеличиваясь по отношению к существующим объектам, что не должно быть настолько медленным. Пока возможно расширение 3.5 / Linq, в любом случае лучше. FindAll имеет гораздо больше смысла, если ограничен версией 2.0

-2
ответ дан 27 November 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: