2010-03-10 16 views
8

मैं प्रोसेसर कैसे काम करता हूं इस पर बहुत विशेषज्ञ नहीं हूं, लेकिन कोई कल्पना कर सकता है कि स्मृति के हिस्सों को गैर शून्य मानों से शून्य तक सेट करना आसान था और इसलिए यह मामूली तेजी से हो सकता है।शून्य शून्य मानों के साथ स्मृति भरना शून्य से भरने से धीमा है?

+0

कैसे आप शून्य को उन मात्रा निर्धारित करने के लिए योजना बना रहे हैं? –

+0

@neil, ermmm memset()? लेकिन मैं सुझावों के लिए खुला हूं। – Mick

+0

वास्तव में प्रश्न का उत्तर देने के लिए आपको मेमसेट के अपने संस्करण के लिए स्रोत कोड पर एक नज़र रखना होगा, और आपके कंपाइलर के एंबलर को इसके लिए उत्सर्जित करना होगा। –

उत्तर

8

मुझे लगता है कि फर्क सिर्फ इतना रजिस्टर स्मृति को स्टोर करने के लिए मूल्य नहीं है की स्थापना में किया जाएगा। कुछ प्रोसेसर के पास एक रजिस्टर होता है जो शून्य पर तय होता है (उदाहरण के लिए ia64)। इसके बावजूद, एक रजिस्टर स्थापित करने के लिए जो भी मामूली ओवरहेड हो सकता है, वह लेखन द्वारा मेमोरी में भयानक रूप से बौना हो जाएगा।

जहां तक ​​वास्तव में स्मृति को लिखने का समय है - यह उन सभी आर्किटेक्चर पर समान दिखाई देगा जिन्हें मैं परिचित हूं।

1

यदि आप वर्चुअल मेमोरी सिस्टम की मदद से ऐसा कर सकते हैं, तो आप गैर-शून्य पृष्ठों से शून्य (गैर-आवंटित) पृष्ठों को तेज़ी से प्राप्त कर सकते हैं। इस तरह के अनुकूलन का सामान्य रूप से सी ++ अनुप्रयोगों (जैसे मानक लाइब्रेरी कार्यान्वयन) में उपयोग नहीं किया जाता है, इसलिए किसी अन्य मूल्य के विरुद्ध शून्य से भरे std :: वेक्टर आवंटित करने के बीच कोई अंतर प्राप्त करने की अपेक्षा न करें।

1

मुझे कोई कारक नहीं है, क्योंकि इसमें शामिल कारकों की संख्या है, लेकिन पता लगाने का तरीका दोनों तरीकों को कोड करना और उन्हें बेंचमार्क करना है।

यह ध्यान देने योग्य है कि विंडोज VirtualAlloc फ़ंक्शन नव-आवंटित स्मृति को शून्य पर प्रारंभ करता है, हालांकि माइक्रोसॉफ्ट डीबग सी ++ रनटाइम इसे बाद में आपके लिए डमी मानों में रीसेट करता है। यदि आप शून्य-प्रारंभिक स्मृति का त्वरित स्रोत चाहते हैं तो यह ओएस पर सीधे जा सकता है।

+2

मुझे नहीं पता कि आप किस विंडोज आवंटन समारोह के बारे में बात कर रहे हैं, लेकिन यदि यह ग्लोबल अलाक है, तो यह डिफ़ॉल्ट रूप से शून्य-सेट मेमोरी आवंटित नहीं करता है, हालांकि इसका अनुरोध किया जा सकता है। –

+0

@Neil: VirtualAlloc (MEM_COMMIT) 0 भरी स्मृति आवंटित करता है। –

+0

क्या आप निश्चित रूप से विंडोज प्रारंभिक चीज़ के लिए हैं? मेमोरी का एक बड़ा हिस्सा सेट करने के लिए यह काफी शक्ति और समय लेने वाला होगा चाहे कार्यक्रम की आवश्यकता हो या नहीं, है ना? – Seb

0

मेमोरी सेल को शून्य पर सेट करने के लिए सीपीयू निर्देश होने पर यह तेज़ होगा। लेकिन कोई नहीं है।

-1

इंटेल आर्किटेक्चर पर बहुत आम अनुकूलन, xor a,b ऑपरेशन का उपयोग करना है जहां दोनों ऑपरेटरों एक ही स्मृति स्थान हैं। यह रजिस्टर में मूल्य स्टोर करने और चालन संचालन करने की किसी भी आवश्यकता को हटा देता है। इसलिए यदि पुस्तकालय इस अनुकूलन का उपयोग करता है, तो शून्य लिखना तेज़ है।

मैं अपने आप को दूर करने के लिए, सिर्फ तभी जब दोनों ऑपरेंड रजिस्टर, तो XOR प्रयोग किया जाता है है।

+3

उम्म, क्या उसे स्मृति पढ़ने की आवश्यकता नहीं होगी, उसके बाद xor ऑपरेशन के बाद, फिर मेमोरी लिखने के बाद? वह बहुत धीमा होगा। – Tronic

+0

@ पुरानी, ​​मुझे लगता है कि आप सही हैं, असेंबली पढ़ रहे हैं, ऐसा लगता है कि दोनों ऑपरेशंस एक्सएमएम रजिस्टर्स हैं, फिर यह xor – Anycorn

3

सैद्धांतिक रूप से, यह यह वास्तव में तेजी से हो सकता है।

सबसे पहले, हार्डवेयर प्लेटफ़ॉर्म एक समर्पित CPU निर्देश प्रदान कर सकता है जो स्मृति को शून्य पर सेट करता है।

दूसरे, शून्य विशेष रूप से एक आलसी आपरेशन के रूप में ओएस/हार्डवेयर द्वारा समर्थित किया जा सकता है के लिए स्मृति की स्थापना, शून्य करने के लिए वास्तव में स्थापित करने का कार्य स्मृति यानी वास्तव में बस इस स्मृति क्षेत्र अंकन के शून्यीकरण के लिए के अलावा कुछ भी नहीं है पहले पढ़ने पर। (बेशक, ऐसा कुछ ओएस/हार्डवेयर स्तर पर प्रबंधित स्मृति क्षेत्रों के साथ ही संभव है)।

बाद वास्तव में कारणों calloc समारोह मौजूद है में से एक है: कुछ प्लेटफार्मों पर यह एक मात्र malloc एक शून्य करने के लिए memset के बाद की तुलना में काफी अधिक कुशलता से लागू किया जा सकता। ऐसे प्लेटफार्मों पर प्रभाव बहुत बड़ा होगा, न कि "मामूली"।

+1

+1 का उपयोग करता है। और कुछ ओएस शून्य पृष्ठों वाले पूल का रखरखाव करते हैं, जिन्हें वे खाली समय पर शून्य कर सकते हैं। – tony

2

यदि आप बफर को संरेखित करते हैं तो यह पीपीसी पर तेज़ी से हो सकता है, क्योंकि आप केवल डीसीबीज़ कैश निर्देश का उपयोग कर सकते हैं। ऐसा कुछ नहीं है जिसे आपको सभी मामलों में तेजी से गिनना चाहिए।

एक लेख है कि इस का उल्लेख है: http://www.ibm.com/developerworks/power/library/pa-memory/index.html

+0

उस लिंक के लिए धन्यवाद। मैंने पहले कभी कैश-विशिष्ट निर्देश नहीं देखा है। –

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