2010-05-28 7 views
7

प्रतिक्रियाशील एक्सटेंशन से System.Interactive.dll (v1.0.2521.0) में, EnumerableEx में Memoize विधि और MemoizeAll विधि दोनों हैं। एपीआई दस्तावेज उन दोनों के लिए समान है:सिस्टम। इंटरैक्टिव: Memoize() और MemoizeAll() के बीच अंतर?

एक गणित बनाता है जो केवल एक बार मूल गणना करता है और इसके परिणामों को कैश करता है।

हालांकि, ये विधियां स्पष्ट रूप से समान नहीं हैं। अगर मैं Memoize का उपयोग करता हूं, तो मेरे गणित के पास पहली बार मानते हैं कि मैं इसे गिनता हूं, और दूसरी बार खाली लगता है। यदि मैं MemoizeAll का उपयोग करता हूं तो मुझे वह व्यवहार मिलता है जो मैं किसी भी विधि के विवरण से अपेक्षा करता हूं - मैं परिणाम जितनी बार चाहूं उतनी बार समझा सकता हूं और हर बार एक ही परिणाम प्राप्त कर सकता हूं, लेकिन स्रोत केवल एक बार समझा जाता है।

क्या कोई मुझे बता सकता है कि इन तरीकों के बीच क्या अंतर है? Memoize के लिए उपयोग-केस क्या है? यह वास्तव में भ्रमित दस्तावेज के साथ एक काफी बेकार विधि की तरह लगता है।

उत्तर

7

इसे वास्तव में सरलता से रखने के लिए, MemoizeAll केवल उन चीज़ों को कैश करता है जिन्हें आप वास्तव में उपयोग करते हैं - लेकिन यह हमेशा के लिए सभी कैश किए गए आइटमों पर निर्भर करता है। Memoize तुरंत कैश आइटम, लेकिन केवल निर्दिष्ट बफर आकार तक। यह आपको स्मृति उपयोग आदि के साथ बहुत अधिक कुशल बनाने देता है, लेकिन आप केवल उत्तरार्द्ध का उपयोग करना चाहते हैं यदि आप समझते हैं कि समृद्ध स्रोत के सभी उपभोक्ता इसका उपयोग कैसे करेंगे। http://bartdesmet.net/blogs/bart/archive/2010/01/07/more-linq-with-system-interactive-functional-fun-and-taming-side-effects.aspx

+0

धन्यवाद, कि वास्तव में एक अच्छी व्याख्या है:

इस ब्लॉग पोस्ट में अंतर का एक वास्तव में महान स्पष्टीकरण नहीं है। हो सकता है कि प्रतिक्रियाशील एक्सटेंशन के भविष्य के संस्करण 'Memoize' के विवरण का विस्तार करेंगे। –

संबंधित मुद्दे