मूल नियम वास्तव में काफी सरल हैं। जहां यह मुश्किल हो जाता है कि वे आपके कोड पर कैसे लागू होते हैं।
कैश दो सिद्धांतों पर काम करता है: अस्थायी स्थानीयता और स्थानिक इलाके। पूर्व का विचार है कि यदि आपने हाल ही में डेटा का एक निश्चित हिस्सा इस्तेमाल किया है, तो आपको शायद जल्द ही फिर से इसकी आवश्यकता होगी। उत्तरार्द्ध का मतलब है कि यदि आपने हाल ही में पता X पर डेटा का उपयोग किया है, तो आपको शायद जल्द ही पता X + 1 की आवश्यकता होगी।
कैश डेटा के सबसे हाल ही में इस्तेमाल किए गए चंक्स को याद करके इसे समायोजित करने की कोशिश करता है। यह कैश लाइनों के साथ काम करता है, आम तौर पर 128 बाइट या तो आकार का होता है, इसलिए भले ही आपको केवल एक बाइट की आवश्यकता हो, पूरी कैशे लाइन जिसमें यह कैश में खींच लिया जाता है। इसलिए यदि आपको निम्नलिखित बाइट की आवश्यकता है, तो यह पहले से ही कैश में होगा।
और इसका मतलब है कि आप हमेशा यही चाहेंगे कि आपका अपना कोड जितना संभव हो सके स्थानीयता के इन दो रूपों का दोहन करे। सभी स्मृति पर कूद मत करो। जितना काम आप एक छोटे से क्षेत्र पर कर सकते हैं उतना ही करें, और फिर अगले काम पर जाएं, और जितना हो सके उतना काम करें।
एक सरल उदाहरण 2 डी सरणी ट्रैवर्सल है जो 1800 का उत्तर दिखाता है। यदि आप इसे एक बार में एक पंक्ति में ले जाते हैं, तो आप क्रमिक रूप से मेमोरी पढ़ रहे हैं। यदि आप इसे कॉलम-वार करते हैं, तो आप एक प्रविष्टि पढ़ेंगे, फिर एक पूरी तरह से अलग स्थान पर जा सकते हैं (अगली पंक्ति की शुरुआत), एक प्रविष्टि पढ़ें, और फिर से कूदें। और जब आप अंततः पहली पंक्ति में वापस आते हैं, तो यह अब कैश में नहीं होगा।
कोड पर वही लागू होता है। कूद या शाखाओं का मतलब कम कुशल कैश उपयोग है (क्योंकि आप क्रमिक रूप से निर्देशों को नहीं पढ़ रहे हैं, लेकिन एक अलग पते पर कूद रहे हैं)। बेशक, छोटे अगर बयान कुछ भी नहीं बदलेंगे (आप केवल कुछ बाइट्स छोड़ रहे हैं, तो आप अभी भी कैश्ड क्षेत्र के अंदर समाप्त हो जाएंगे), लेकिन फ़ंक्शन कॉल आमतौर पर इसका मतलब है कि आप पूरी तरह से अलग हो रहे हैं पता जिसे कैश नहीं किया जा सकता है। जब तक कि इसे हाल ही में नहीं बुलाया गया।
अनुदेश कैश का उपयोग आमतौर पर हालांकि एक समस्या से कम है। डेटा कैश के बारे में आपको आमतौर पर चिंता करने की जरूरत है।
एक संरचना या वर्ग में, सभी सदस्यों को सन्निहित रूप से रखा जाता है, जो अच्छा है। एक सरणी में, सभी प्रविष्टियों को संचित रूप से निर्धारित किया गया है। लिंक की गई सूचियों में, प्रत्येक नोड को पूरी तरह से अलग स्थान पर आवंटित किया गया है, जो खराब है। सामान्य तौर पर पॉइंटर्स असंबंधित पते की ओर इशारा करते हैं, जिसके परिणामस्वरूप यदि आप इसे डीरेंस करते हैं तो संभवतः कैश मिस हो जाएगा।
और अगर आप कई कोर का शोषण करना चाहते हैं, तो यह वास्तव में दिलचस्प हो सकता है, जैसा कि आमतौर पर, एक समय में केवल एक सीपीयू का उसके एल 1 कैश में कोई भी पता हो सकता है। इसलिए यदि दोनों कोर लगातार एक ही पते पर पहुंचते हैं, तो इसका परिणाम लगातार कैश मिस होगा, क्योंकि वे पते पर लड़ रहे हैं।