Ответ на Какова ожидаемая производительность IEnumerable? говорит, что нет никакого способа узнать что-либо о производительности итерации произвольного IEnumerable. Каждая итерация может обращаться к базе данных или выполнять вызов веб-службы; или он может просто вернуть следующий элемент в массиве/списке.
Учитывая это, есть ли хороший способ указать «это быстро»? Например, с T[]
или List
вместо IEnumerable
я знаю, что переход от T[i]
на T[i+1]
будет быстрым. (Конечно, принуждение перечисления к возврату списка/массива может создать другие проблемы с производительностью. List
также предоставляет редактируемую семантику.)
И наоборот, возврат IQueryable
вместо IEnumerable
будет хорошим способом указать, что «это медленно»? Или, может быть, IEnumerable
?
Клиенты C
не могут знать, что IEnumerable
будут иметь резко отличающиеся характеристики производительности.
class C
{
readonly T[] m_data;
public IEnumerable ThisWillIterateQuickly { get { return m_data; } }
public IEnumeralbe ThisWillIterateSlowly
{
get
{
T retval = ... an expensive database call ...;
yield return retval;
}
}
public IQueryable IsThisBetterForSlow { get { return ThisWillIterateSlowly; } }
public T[] IsThisAGoodWayForFast { get { return m_data; } }
}