Любой знает любую разность оборотов между Где и FindAll в Списке. Я знаю, Где часть IEnumerable и FindAll, часть Списка, мне просто любопытно, что быстрее.
Метод FindAll класса List
При небольшом наборе два, вероятно, будут работать сравнительно. Однако, учитывая больший набор, Where должно превзойти FindAll, поскольку новый список, созданный для содержания результатов, должен будет динамически расти, чтобы содержать дополнительные результаты. Использование памяти FindAll также начнет экспоненциально расти по мере увеличения числа совпадающих результатов, при этом as Where должно иметь постоянное минимальное использование памяти (само по себе ... исключая все, что вы делаете с результатами).
{{1 }} Где
намного быстрее, чем FindAll
. Независимо от того, насколько велик список, , где
занимает точно такое же количество времени.
Конечно, Где
просто создает запрос. На самом деле он ничего не делает, в отличие от FindAll
, который создает список.
Это похоже на решение 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.
Ответ от jrista имеет смысл. Однако новый список добавляет те же объекты, таким образом, только увеличиваясь по отношению к существующим объектам, что не должно быть настолько медленным. Пока возможно расширение 3.5 / Linq, в любом случае лучше. FindAll имеет гораздо больше смысла, если ограничен версией 2.0