2010-05-28 15 views
7

W System.Interactive.dll (v1.0.2521.0) z Reactive Extensions, EnumerableEx ma zarówno metodę Memoize jak i metodę MemoizeAll. Dokumentacja API jest identyczna dla obu:System.Interactive: Różnica między Memoize() i MemoizeAll()?

Tworzy wyliczalnik wyliczający pierwotny wyliczalny tylko jeden raz i zapisuje wyniki w pamięci podręcznej.

Jednak metody te wyraźnie nie są identyczne. Jeśli używam Memoize, mój wyliczalny ma wartości przy pierwszym wyliczeniu go i wydaje się pusty za drugim razem. Jeśli użyję MemoizeAll, otrzymam zachowanie, jakiego oczekiwałbym od opisu każdej z tych metod - mogę wyliczyć wynik tyle razy, ile chcę i uzyskać za każdym razem te same wyniki, ale źródło jest wyliczane tylko jeden raz.

Czy ktoś może mi powiedzieć, jaka jest zamierzona różnica między tymi metodami? Jaki jest przypadek użycia dla Memoize? Wydaje się to być dość bezużyteczną metodą z naprawdę mylącą dokumentacją.

Odpowiedz

7

to naprawdę proste, MemoizeAll tylko buforuje rzeczy, których faktycznie używasz - ale zachowuje na zawsze wszystkie elementy zapisane w pamięci podręcznej. Memoize buforuje elementy natychmiast, ale tylko do określonego rozmiaru bufora. Dzięki temu możesz być bardziej wydajny przy użyciu pamięci itd., Ale chcesz używać tego ostatniego tylko wtedy, gdy zrozumiesz, jak wykorzystają go wszyscy konsumenci z przeliczalnego źródła.

Jest to naprawdę wspaniałe wyjaśnienie różnicy w tym blogu: http://bartdesmet.net/blogs/bart/archive/2010/01/07/more-linq-with-system-interactive-functional-fun-and-taming-side-effects.aspx

+0

Dzięki, że to rzeczywiście dobre wytłumaczenie. Być może przyszłe wersje rozszerzeń reaktywnych rozwiną opis "Memoize". –