2011-06-24 11 views
59

मैं जानना चाहता हूं कि कैशिंग और ज्ञापन के बीच वास्तविक अंतर क्या है। जैसा कि मैंने इसे देखा है, दोनों इसे संग्रहीत करके डेटा प्राप्त करने के लिए बार-बार फ़ंक्शन कॉल से बचने में शामिल हैं।कैशिंग और यादों के बीच क्या अंतर है?

दोनों के बीच क्या अंतर है?

+0

मुझे आश्चर्य है कि क्या आप कह सकते हैं कि "स्मृति को कैशिंग करना है" के रूप में "सरणी सरणी स्प्रे करना है"। दूसरे शब्दों में, आप केवल हर संभावित इनपुट संयोजन की गणना करने के बजाय "मांग पर" चीजें संग्रहीत करते हैं। –

उत्तर

60

ज्ञापन कैशिंग का एक विशिष्ट रूप है जिसमें इसके पैरामीटर के आधार पर फ़ंक्शन के रिटर्न वैल्यू को कैशिंग करना शामिल है।

कैशिंग एक अधिक सामान्य शब्द है; उदाहरण के लिए, HTTP कैशिंग कैशिंग है लेकिन ज्ञापन नहीं है।

विकिपीडिया says:

हालांकि कैशिंग करने के लिए संबंधित, Memoization, इस अनुकूलन के लिए एक विशेष मामले के लिए संदर्भित करता है जैसे बफरिंग या पेज प्रतिस्थापन कैशिंग के रूपों से यह भेद।

+2

लेकिन आप हमेशा उस हिस्से को तोड़ सकते हैं जहां कैश का उपयोग किसी फ़ंक्शन के साथ किया जाता है और इसे 'ज्ञापन' नाम दिया जाता है। हालांकि अंतर यह है कि आप अपने कार्य में कैशिंग नीति के नियंत्रण में हैं, जबकि ज्ञापन उच्च आदेश है और मुझे लगता है कि समारोह के बाहर होता है। – nicolas

5

मुझे लगता है कि अवधि कैशिंग आमतौर पर इस्तेमाल किया जाता है जब आप आईओ आपरेशन के परिणामों, या मूल रूप से किसी भी डेटा को बाहर से आप के लिए आ रहा है (फ़ाइलें, नेटवर्क, डाटाबेस क्वेरी) की दुकान। टर्म ज्ञापन आमतौर पर आपके स्वयं के गणना के परिणामों को संग्रहीत करने के लिए लागू होता है, उदाहरण के लिए गतिशील प्रोग्रामिंग के संदर्भ में।

23

मैं उन्हें इस्तेमाल किया देखा है, "Memoization" है कि एक ही समारोह और आदानों दिया किसी भी समय reproduced किया जा सकता है "एक नियतात्मक फ़ंक्शन के परिणाम कैशिंग" है।

"कैशिंग" में मूल रूप से कोई आउटपुट-बफरिंग रणनीति शामिल है, चाहे किसी भी समय स्रोत मान पुन: उत्पन्न हो या नहीं। वास्तव में, कैशिंग का उपयोग इनपुट बफरिंग रणनीतियों, जैसे डिस्क या मेमोरी पर लिखने-कैश को संदर्भित करने के लिए भी किया जाता है। तो यह एक और अधिक सामान्य शब्द है।

+0

क्या आप सुनिश्चित हैं कि फ़ंक्शन को निर्धारक होना चाहिए? – Gherman

+1

@ जर्मनी, हाँ, ज्ञापन निर्धारणवाद पर निर्भर करता है। क्लासिक उदाहरण एक रिकर्सिव एल्गोरिदम है, जैसे कि फाइबोनैकी अनुक्रम या फैक्टोरियल। आधार मामले में सभी तरह से फिर से कंप्यूटिंग करने के बजाय, एक ज्ञात फ़ंक्शन पहले से गणना किए गए मानों के पहले परिणामों का पुन: उपयोग करके शॉर्ट सर्किट करेगा। यह स्पष्ट रूप से उसी इनपुट पर निर्भर करता है जो हमेशा एक ही आउटपुट उत्पन्न करता है, जो निर्धारणा की परिभाषा है। दूसरी ओर, कैशिंग को अक्सर गैर-निर्धारिती (उदा। यादृच्छिक या टाइमस्टैम्प) प्रक्रियाओं के लिए उपयोग किया जाता है, यह समझने के साथ कि परिणाम "ताज़ा" मान से मेल नहीं खाते हैं। – harpo

0

ज्ञापन एक निर्धारक कार्य के परिणाम को कैशिंग का एक विशेष रूप है। इसका मतलब है कि फ़ंक्शन के बाहर परिणाम कैशिंग करना ज्ञापन नहीं है क्योंकि नए परिणाम की गणना करते समय फ़ंक्शन को कैश को बदलना होगा (पहले से ही कैश में नहीं) इसलिए यह अब (शुद्ध) फ़ंक्शन नहीं होगा। ज्ञापन आमतौर पर कैश को एक अतिरिक्त तर्क (एक सहायक समारोह में) के रूप में पारित करने का तात्पर्य है। ज्ञापन उन कार्यों को अनुकूलित करेगा जिन्हें एकल पहुंच के लिए कई बार मानों की गणना करने की आवश्यकता होती है। कैशिंग उन कार्यों को अनुकूलित करेगी जिन्हें एक ही पैरामीटर के साथ कई बार कहा जाता है। दूसरे शब्दों में, ज्ञापन पहली पहुंच को अनुकूलित करेगा चाहे कैशिंग केवल पुनरावर्ती पहुंच को अनुकूलित करेगी।

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