सी

2008-11-27 13 views
22

में memcpy बनाम असाइनमेंट क्या मुझे परिस्थितियों में आधुनिक INTEL/AMD हार्डवेयर पर असाइनमेंट को बेहतर प्रदर्शन करने की अपेक्षा करनी चाहिए? मैं 32 बिट इंटेल प्लेटफार्म पर जीसीसी 4.2.एक्स का उपयोग कर रहा हूं (लेकिन 64 बिट में भी दिलचस्पी है)।सी

+0

दिलचस्प सवाल! जैसा कि आप स्पष्ट रूप से चिंतित हैं कि मेमोरी ऑपरेशंस की गति में सुधार कैसे किया जाए: हाल ही में मैंने पीईटीबल्स विकसित करने वाले किसी व्यक्ति से मेमोरी ट्रांसफर में संपीड़न की भूमिका के बारे में पढ़ा है: http://www.pytables.org/docs/StarvingCPUs.pdf जैसा कि वर्णन किया गया है, बहुत तेज कंप्रेसर ([blosc] (http://blosc.pytables.org/trac/) के साथ उनके सुधार की तुलना में memcpy का सामान्य उपयोग धीमा हो सकता है)। कृपया इसे उच्च प्रदर्शन सामग्री के लिए ही देखें! – math

+0

यह सवाल काफी व्यापक है। –

उत्तर

33

आपको उन्हें कभी भी असाइनमेंट की अपेक्षा नहीं करनी चाहिए। इसका कारण यह है कि कंपाइलर किसी भी तरह मेम्पी का उपयोग करेगा जब ऐसा लगता है कि यह तेज़ होगा (यदि आप ऑप्टिमाइज़ फ्लैग का उपयोग करते हैं)। यदि नहीं और यदि संरचना उचित है कि यह रजिस्टरों में फिट बैठती है, तो प्रत्यक्ष पंजीकरण मैनिपुलेशन का उपयोग किया जा सकता है जिसके लिए किसी मेमोरी एक्सेस की आवश्यकता नहीं होती है।

जीसीसी में विशेष रूप से रजिस्ट्रार/मेमोरी कोशिकाओं को बदलने के लिए, या memcpy फ़ंक्शन का उपयोग करने के दौरान आंतरिक ब्लॉक-चाल पैटर्न होते हैं। नोट को कॉन्फ़िगर करते समय नोट करें, कंपाइलर संकलन समय जानता है कि चाल कितनी बड़ी होगी, इसलिए यह छोटी प्रतियां अनलॉक कर सकती है (उदाहरण के लिए लूपिंग के बजाय पंक्ति में एन-बार स्थानांतरित करें)। नोट -mno-memcpy:

-mmemcpy 
-mno-memcpy 
    Force (do not force) the use of "memcpy()" for non-trivial block moves. 
    The default is -mno-memcpy, which allows GCC to inline most constant-sized copies. 

कौन बेहतर जानता है जब संकलक से भी memcpy उपयोग करने के लिए?

+4

ध्यान दें कि रिवर्स लागू हो सकता है - कम से कम जीसीसी में, एक छोटे स्थिर आकार के memcpy प्रतिलिपि निर्देशों के साथ प्रतिस्थापित किया गया है, और यदि एक छोटे स्रोत और/या गंतव्य के लिए सूचक के साथ प्रयोग किया जाता है * नहीं * एक या दोनों को अनुकूलित किया जा रहा है रजिस्टरों। तो: सबसे सरल कोड में जो भी परिणाम हो। –

+2

आपको किसी को दूसरे से बेहतर प्रदर्शन करने की उम्मीद नहीं करनी चाहिए। यदि आपके पास कोई प्रदर्शन समस्या है, तो आपको इसे प्रोफ़ाइल करना चाहिए, देखें कि क्या असाइनमेंट/memcpy समस्या है, और यदि ऐसा है, तो उन्हें दूसरे का उपयोग करने के लिए बदलने का प्रयास करें, और देखें कि यह बेहतर प्रदर्शन करता है या नहीं। अधिक प्रोफाइलिंग, कम अनुमान। ;) – jalf

+1

यह कहने के लिए, मैं उम्मीद करता हूं कि "असाइनमेंट गलत तरीके से बेहतर होगा", क्योंकि प्रश्नकर्ता ने हाल ही में जीसीसी निर्दिष्ट किया है। लेकिन मानते हैं कि कोई कलाकार नहीं है, मैं असाइनमेंट का उपयोग करने के लिए आपकी सलाह से सहमत हूं, क्योंकि इसका परिणाम स्पष्ट कोड में होता है। –