Как правильно указать, что IEnumerable является «медленным» или «быстрым»?

Ответ на Какова ожидаемая производительность 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; } }
 }

7
задан Community 23 May 2017 в 12:09
поделиться