Odpowiedź na What is the expected performance of IEnumerable? mówi, że nie ma sposobu, aby dowiedzieć się czegoś o wykonaniu iteracji arbitralnego IEnumerable. Każda iteracja może trafić do bazy danych lub wykonać połączenie z serwisem sieciowym; lub może po prostu zwrócić następny element w tablicy/liście.Jaki jest dobry sposób, aby wskazać, że IEnumerable jest "wolny" lub "szybki"?
Biorąc to pod uwagę, czy istnieje dobry sposób na wskazanie "jest szybki"? Na przykład z T[]
lub List<T>
zamiast IEnumerable<T>
Wiem, że przejście z T[i]
do T[i+1]
będzie szybkie. (Oczywiście, zmuszając wyliczenie zwraca listę/tablicy można utworzyć inne problemy z wydajnością. List<T>
naraża również edytowalne semantykę.)
odwrotnie, byłoby powrocie IQueryable<T>
zamiast IEnumerable<T>
być dobrym sposobem, aby wskazać „to jest powolna”? A może IEnumerable<Task<T>>
?
Klienci o numerze C
nie mają możliwości dowiedzenia się, że modele IEnumerable<T>
będą miały znacznie odmienne cechy wydajności.
class C
{
readonly T[] m_data;
public IEnumerable<T> ThisWillIterateQuickly { get { return m_data; } }
public IEnumeralbe<T> ThisWillIterateSlowly
{
get
{
T retval = ... an expensive database call ...;
yield return retval;
}
}
public IQueryable<T> IsThisBetterForSlow { get { return ThisWillIterateSlowly; } }
public T[] IsThisAGoodWayForFast { get { return m_data; } }
}
Może to brzmieć mgliście, ale coś jest powolne * tylko * jeśli myślisz, że to nie * wystarczająco szybko *. –
Nie ma standardowego mechanizmu reklamowania. Może po prostu: dokumentacja? –
Re IQueryable ... Tablica może zostać ujawniona jako IQueryable - nie mówi nic o perf –