मैं प्रोसेसर कैसे काम करता हूं इस पर बहुत विशेषज्ञ नहीं हूं, लेकिन कोई कल्पना कर सकता है कि स्मृति के हिस्सों को गैर शून्य मानों से शून्य तक सेट करना आसान था और इसलिए यह मामूली तेजी से हो सकता है।शून्य शून्य मानों के साथ स्मृति भरना शून्य से भरने से धीमा है?
उत्तर
मुझे लगता है कि फर्क सिर्फ इतना रजिस्टर स्मृति को स्टोर करने के लिए मूल्य नहीं है की स्थापना में किया जाएगा। कुछ प्रोसेसर के पास एक रजिस्टर होता है जो शून्य पर तय होता है (उदाहरण के लिए ia64)। इसके बावजूद, एक रजिस्टर स्थापित करने के लिए जो भी मामूली ओवरहेड हो सकता है, वह लेखन द्वारा मेमोरी में भयानक रूप से बौना हो जाएगा।
जहां तक वास्तव में स्मृति को लिखने का समय है - यह उन सभी आर्किटेक्चर पर समान दिखाई देगा जिन्हें मैं परिचित हूं।
यदि आप वर्चुअल मेमोरी सिस्टम की मदद से ऐसा कर सकते हैं, तो आप गैर-शून्य पृष्ठों से शून्य (गैर-आवंटित) पृष्ठों को तेज़ी से प्राप्त कर सकते हैं। इस तरह के अनुकूलन का सामान्य रूप से सी ++ अनुप्रयोगों (जैसे मानक लाइब्रेरी कार्यान्वयन) में उपयोग नहीं किया जाता है, इसलिए किसी अन्य मूल्य के विरुद्ध शून्य से भरे std :: वेक्टर आवंटित करने के बीच कोई अंतर प्राप्त करने की अपेक्षा न करें।
मुझे कोई कारक नहीं है, क्योंकि इसमें शामिल कारकों की संख्या है, लेकिन पता लगाने का तरीका दोनों तरीकों को कोड करना और उन्हें बेंचमार्क करना है।
यह ध्यान देने योग्य है कि विंडोज VirtualAlloc
फ़ंक्शन नव-आवंटित स्मृति को शून्य पर प्रारंभ करता है, हालांकि माइक्रोसॉफ्ट डीबग सी ++ रनटाइम इसे बाद में आपके लिए डमी मानों में रीसेट करता है। यदि आप शून्य-प्रारंभिक स्मृति का त्वरित स्रोत चाहते हैं तो यह ओएस पर सीधे जा सकता है।
मुझे नहीं पता कि आप किस विंडोज आवंटन समारोह के बारे में बात कर रहे हैं, लेकिन यदि यह ग्लोबल अलाक है, तो यह डिफ़ॉल्ट रूप से शून्य-सेट मेमोरी आवंटित नहीं करता है, हालांकि इसका अनुरोध किया जा सकता है। –
@Neil: VirtualAlloc (MEM_COMMIT) 0 भरी स्मृति आवंटित करता है। –
क्या आप निश्चित रूप से विंडोज प्रारंभिक चीज़ के लिए हैं? मेमोरी का एक बड़ा हिस्सा सेट करने के लिए यह काफी शक्ति और समय लेने वाला होगा चाहे कार्यक्रम की आवश्यकता हो या नहीं, है ना? – Seb
मेमोरी सेल को शून्य पर सेट करने के लिए सीपीयू निर्देश होने पर यह तेज़ होगा। लेकिन कोई नहीं है।
इंटेल आर्किटेक्चर पर बहुत आम अनुकूलन, xor a,b
ऑपरेशन का उपयोग करना है जहां दोनों ऑपरेटरों एक ही स्मृति स्थान हैं। यह रजिस्टर में मूल्य स्टोर करने और चालन संचालन करने की किसी भी आवश्यकता को हटा देता है। इसलिए यदि पुस्तकालय इस अनुकूलन का उपयोग करता है, तो शून्य लिखना तेज़ है।
मैं अपने आप को दूर करने के लिए, सिर्फ तभी जब दोनों ऑपरेंड रजिस्टर, तो XOR प्रयोग किया जाता है है।
सैद्धांतिक रूप से, यह यह वास्तव में तेजी से हो सकता है।
सबसे पहले, हार्डवेयर प्लेटफ़ॉर्म एक समर्पित CPU निर्देश प्रदान कर सकता है जो स्मृति को शून्य पर सेट करता है।
दूसरे, शून्य विशेष रूप से एक आलसी आपरेशन के रूप में ओएस/हार्डवेयर द्वारा समर्थित किया जा सकता है के लिए स्मृति की स्थापना, शून्य करने के लिए वास्तव में स्थापित करने का कार्य स्मृति यानी वास्तव में बस इस स्मृति क्षेत्र अंकन के शून्यीकरण के लिए के अलावा कुछ भी नहीं है पहले पढ़ने पर। (बेशक, ऐसा कुछ ओएस/हार्डवेयर स्तर पर प्रबंधित स्मृति क्षेत्रों के साथ ही संभव है)।
बाद वास्तव में कारणों calloc
समारोह मौजूद है में से एक है: कुछ प्लेटफार्मों पर यह एक मात्र malloc
एक शून्य करने के लिए memset
के बाद की तुलना में काफी अधिक कुशलता से लागू किया जा सकता। ऐसे प्लेटफार्मों पर प्रभाव बहुत बड़ा होगा, न कि "मामूली"।
+1 का उपयोग करता है। और कुछ ओएस शून्य पृष्ठों वाले पूल का रखरखाव करते हैं, जिन्हें वे खाली समय पर शून्य कर सकते हैं। – tony
यदि आप बफर को संरेखित करते हैं तो यह पीपीसी पर तेज़ी से हो सकता है, क्योंकि आप केवल डीसीबीज़ कैश निर्देश का उपयोग कर सकते हैं। ऐसा कुछ नहीं है जिसे आपको सभी मामलों में तेजी से गिनना चाहिए।
एक लेख है कि इस का उल्लेख है: http://www.ibm.com/developerworks/power/library/pa-memory/index.html
उस लिंक के लिए धन्यवाद। मैंने पहले कभी कैश-विशिष्ट निर्देश नहीं देखा है। –
- 1. शून्य शून्य शून्य अनंत के बराबर है?
- 2. शून्य से शून्य करने के लिए शून्य के साथ गलत क्या है?
- 3. शून्य मानों के साथ सॉर्टिंग सरणी
- 4. शून्य मानों के साथ एक सूची छंटनी
- 5. शून्य मानों के लिए डिफ़ॉल्ट
- 6. सूचकांक (शून्य आधारित) शून्य से अधिक या
- 7. प्रकार शून्य शून्य
- 8. शून्य *
- 9. बिगडेसिमल शून्य से गुणा
- 10. शून्य
- 11. ... fragment.getMap() शून्य शून्य देता है
- 12. शून्य से 0
- 13. शून्य रोकथाम से विभाजित
- 14. C++ से शून्य
- 15. + (शून्य) या - (शून्य) अंतर?
- 16. शून्य से डिवीजन एसआईजीएफपीई
- 17. हाइचार्ट से शून्य हटाएं
- 18. MySQL: शून्य से रिक्त फ़ील्ड भरने जब द्वारा
- 19. विस्तारित AsyncTask <शून्य, शून्य, शून्य>
- 20. शून्य
- 21. शून्य
- 22. शून्य *
- 23. शून्य
- 24. शून्य
- 25. शून्य
- 26. क्या जावास्क्रिप्ट में शून्य पर स्मृति है?
- 27. शून्य
- 28. शून्य
- 29. शून्य
- 30. शून्य
कैसे आप शून्य को उन मात्रा निर्धारित करने के लिए योजना बना रहे हैं? –
@neil, ermmm memset()? लेकिन मैं सुझावों के लिए खुला हूं। – Mick
वास्तव में प्रश्न का उत्तर देने के लिए आपको मेमसेट के अपने संस्करण के लिए स्रोत कोड पर एक नज़र रखना होगा, और आपके कंपाइलर के एंबलर को इसके लिए उत्सर्जित करना होगा। –