2009-11-12 12 views
10
void Send(int * to, const int* from, const int count) 
{ 
    int n = (count+7)/8; 
    switch(count%8) 
    { 
     case 0: do { *to++ = *from++; 
     case 7:  *to++ = *from++; 
     case 6:  *to++ = *from++; 
     case 5:  *to++ = *from++; 
     case 4:  *to++ = *from++; 
     case 3:  *to++ = *from++; 
     case 2:  *to++ = *from++; 
     case 1:  *to++ = *from++; 
     } while (--n>0); 
    } 
} 
+4

जैसा कि अन्य ने कहा, डफ की डिवाइस। अगर मैं बहुत गूढ़/obfuscated करने की ज़रूरत नहीं है, तो मैं इसे लागू नहीं करूँगा। मैं पठनीय कोड पसंद करता हूं ;-) हालांकि, यदि इस तरह के फ़ंक्शन में लपेटा गया है, तो अच्छी टिप्पणियां/दस्तावेज़ीकरण के साथ, अगर मैं इसे छूना नहीं चाहता तो मैं इसका उपयोग करूंगा। –

+0

जहां उचित हो वहां डफ के डिवाइस का उपयोग करने में मुझे कोई समस्या नहीं होगी। यह बड़ी गहराई में बात की जाती है और सबसे बड़ी टिप्पणी एक यूआरएल होगी जहां यह पूरी तरह से बात की जाती है। – Jon

+2

वाह - किसी ने वास्तव में ऑप्टिमाइज़ेशन के लिए डफ के डिवाइस का उपयोग करके परेशान किया है, फिर भी मॉड्यूल और विभाजन को एक शिफ्ट में नहीं बदला है ??? – Aaron

उत्तर

17

यह मेमोरी बफर की प्रतिलिपि बनाने के लिए Duff's Device है।

+6

लिंक उत्तर खराब हैं! –

+6

@ सेठ लिंक क्यों जवाब खराब हैं? मैंने पहले कभी डफ के डिवाइस के बारे में कभी नहीं सुना है, और इसके विकिपीडिया लेख का एक लिंक सबसे ऊपर दिए गए उत्तर में खोजने के लिए काफी अच्छा था। –

+4

लिंक की गई सामग्री समय के साथ गायब हो जाती है। शायद विकिपीडिया के साथ कोई बड़ी चिंता नहीं है, लेकिन आमतौर पर प्रासंगिक स्निपेट को आपके उत्तर में कॉपी करने का एक अच्छा विचार है, और संदर्भ को संदर्भ के रूप में जोड़ें। –

3

पढ़ें एक स्विच बयान के बारे में Duff's Device

+2

कृपया लिंक उत्तर प्रदान नहीं करें –

7

यह mingling और थोड़ी देर के पाश "गूंथा हुआ आटा के डिवाइस" कहा जाता है। यह लूप को अनलॉक करने का एक तरीका है, जो अक्सर पहले के समय में उपयोग किया जाने वाला अनुकूलन था।

तो यह कोड अभी भी स्मृति स्थान को एक स्थान से दूसरे स्थान पर कॉपी करता है, लेकिन यह अधिक कुशल हो सकता है। सावधान रहें, आज के आर्किटेक्चर पर आपको हमेशा इसे मापना चाहिए, क्योंकि कैश इलाके और अंधेरे से तेज CPUs लूप अनोलिंग अक्सर एक बुरा विचार है।

4

Duff's device

computer science में, गूंथा हुआ आटा के उपकरण एक धारावाहिक की नकल के लिए एक तकनीक का व्यापक रूप से loop unwinding के लिए assembly language में लागू का उपयोग करता है के optimizedimplementation है। नवंबर 1 9 83 में नवंबर में इसकी खोज Tom Duff पर जमा की गई थी, जो उस समय Lucasfilm के लिए काम कर रहा था। यह आज तक C programming language में case label fall-through का सबसे नाटकीय उपयोग है। गूंथा हुआ आटा सी में loop unrolling की अवधारणा खोज का श्रेय का दावा नहीं करता, उसके मात्र इस विशेष अभिव्यक्ति

5

यह कार्यात्मक नीचे कोड के समान है:

for(int i=0;i<n;i++) 
{ 
    *to++=*from++; 
} 

अंतर यह है कि अपने कोड लूप को अनलॉक करता है ताकि प्रतिलिपि प्रत्येक 8 पूर्णांक के लिए केवल 1 लूप पुनरावृत्ति की आवश्यकता हो। चूंकि मामलों में के लिए कोई ब्रेक नहीं है, इसलिए प्रत्येक केस लेबल से अगले में निष्पादन होता है।

गिनती% 8 == 0, 8 प्रतियां पहले यात्रा के लिए पाश के अंदर क्रियान्वित कर रहे हैं जब

जब गिनती% 8 == 7, 7 प्रतियां पहले यात्रा

के लिए क्रियान्वित कर रहे हैं

और बहुत आगे। % 8 प्रतियों के साथ पहली पुनरावृत्ति के बाद, प्रति पुनरावृत्ति के ठीक 8 प्रतियां होती हैं।

इस तरीके से लूप को अनलॉक करके, लूप ओवरहेड काफी कम हो गया है। केस मानों (0,7,6,5,4,3,2,1) के आदेश को नोट करना महत्वपूर्ण है जो संकलक द्वारा एक जंप टेबल में अनुवाद करने के लिए खुद को उधार देते हैं।

अद्यतन

उदाहरण कोड ओपी द्वारा पोस्ट की गई के साथ एक मुद्दा है कि 0 से गिनती मूल्य 8 प्रतियां जगह लेने के लिए, संभवतः एक बफर अतिप्रवाह में जिसके परिणामस्वरूप का कारण होगा।

+2

आपकी व्याख्या कुछ हद तक स्पष्ट नहीं है। अगर मुझे गलत नहीं लगता है, तो स्विच केवल यह निर्धारित करने के लिए होता है कि पहले पुनरावृत्ति के दौरान कितने अनियंत्रित असाइनमेंट किए जाते हैं (क्षतिपूर्ति करने के लिए कि बफर की लंबाई 8 तक समान रूप से विभाजित नहीं हो सकती है)। – UncleBens

+0

यह सही है। बादल स्पष्टीकरण के लिए खेद है। पृष्ठभूमि पर इस अच्छी टिप्पणी के लिए –

15

यह Duff's Device है। यह अनलॉकिंग लूप का एक तरीका है जो लूप पुनरावृत्ति की संख्या को अनियंत्रित कारक का सटीक बहुतायत नहीं जानता है, समय के साथ निपटने के लिए द्वितीयक फिक्स-अप लूप जोड़ने से बचाता है।

चूंकि यहां अधिकतर उत्तर सामान्य रूप से इसके बारे में सकारात्मक प्रतीत होते हैं, इसलिए मैं इसके खिलाफ बात करने जा रहा हूं।

इस कोड के साथ एक कंपाइलर लूप बॉडी को किसी भी अनुकूलन को लागू करने के लिए संघर्ष करने जा रहा है। यदि आपने कोड को सरल लूप के रूप में लिखा है तो एक आधुनिक कंपाइलर आपके लिए अनोलरिंग को संभालने में सक्षम होना चाहिए। इस तरह आप पठनीयता और प्रदर्शन को बनाए रखते हैं और लूप बॉडी पर अन्य अनुकूलन लागू होने की कुछ आशा रखते हैं।

दूसरों द्वारा संदर्भित विकिपीडिया लेख में यह भी कहा गया है कि जब यह 'पैटर्न' Xfree86 स्रोत कोड प्रदर्शन से हटा दिया गया था वास्तव में सुधार हुआ।

यह परिणाम किसी भी कोड को अनुकूलित करने के अंधेरे हाथ के विशिष्ट है जो आपको लगता है कि इसकी आवश्यकता हो सकती है। यह संकलक को अपनी नौकरी ठीक से करने से रोकता है, आपके कोड को कम पठनीय बनाता है और बग से अधिक प्रवण होता है और आमतौर पर इसे धीमा कर देता है। यदि आप चीजों को पहली जगह सही तरीके से कर रहे थे, यानी सरल कोड लिखना, फिर बाधाओं के लिए प्रोफाइलिंग करना, फिर अनुकूलित करना, आप कभी ऐसा कुछ भी इस्तेमाल नहीं करना चाहेंगे। वैसे भी एक आधुनिक सीपीयू और कंपाइलर के साथ नहीं।

यह समझना ठीक है, लेकिन अगर आप वास्तव में इसका उपयोग करते हैं तो मुझे आश्चर्य होगा।

+0

+1। उस बदसूरत अस्पष्ट चीज़ के बारे में सही राय देने के लिए –

+1

+1। सभी को पता होना चाहिए कि इसका उपयोग क्यों नहीं किया जाए। –

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