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);
}
}
उत्तर
यह मेमोरी बफर की प्रतिलिपि बनाने के लिए Duff's Device है।
लिंक उत्तर खराब हैं! –
@ सेठ लिंक क्यों जवाब खराब हैं? मैंने पहले कभी डफ के डिवाइस के बारे में कभी नहीं सुना है, और इसके विकिपीडिया लेख का एक लिंक सबसे ऊपर दिए गए उत्तर में खोजने के लिए काफी अच्छा था। –
लिंक की गई सामग्री समय के साथ गायब हो जाती है। शायद विकिपीडिया के साथ कोई बड़ी चिंता नहीं है, लेकिन आमतौर पर प्रासंगिक स्निपेट को आपके उत्तर में कॉपी करने का एक अच्छा विचार है, और संदर्भ को संदर्भ के रूप में जोड़ें। –
यह mingling और थोड़ी देर के पाश "गूंथा हुआ आटा के डिवाइस" कहा जाता है। यह लूप को अनलॉक करने का एक तरीका है, जो अक्सर पहले के समय में उपयोग किया जाने वाला अनुकूलन था।
तो यह कोड अभी भी स्मृति स्थान को एक स्थान से दूसरे स्थान पर कॉपी करता है, लेकिन यह अधिक कुशल हो सकता है। सावधान रहें, आज के आर्किटेक्चर पर आपको हमेशा इसे मापना चाहिए, क्योंकि कैश इलाके और अंधेरे से तेज CPUs लूप अनोलिंग अक्सर एक बुरा विचार है।
computer science में, गूंथा हुआ आटा के उपकरण एक धारावाहिक की नकल के लिए एक तकनीक का व्यापक रूप से loop unwinding के लिए assembly language में लागू का उपयोग करता है के optimizedimplementation है। नवंबर 1 9 83 में नवंबर में इसकी खोज Tom Duff पर जमा की गई थी, जो उस समय Lucasfilm के लिए काम कर रहा था। यह आज तक C programming language में case label fall-through का सबसे नाटकीय उपयोग है। गूंथा हुआ आटा सी में loop unrolling की अवधारणा खोज का श्रेय का दावा नहीं करता, उसके मात्र इस विशेष अभिव्यक्ति
यह कार्यात्मक नीचे कोड के समान है:
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 प्रतियां जगह लेने के लिए, संभवतः एक बफर अतिप्रवाह में जिसके परिणामस्वरूप का कारण होगा।
आपकी व्याख्या कुछ हद तक स्पष्ट नहीं है। अगर मुझे गलत नहीं लगता है, तो स्विच केवल यह निर्धारित करने के लिए होता है कि पहले पुनरावृत्ति के दौरान कितने अनियंत्रित असाइनमेंट किए जाते हैं (क्षतिपूर्ति करने के लिए कि बफर की लंबाई 8 तक समान रूप से विभाजित नहीं हो सकती है)। – UncleBens
यह सही है। बादल स्पष्टीकरण के लिए खेद है। पृष्ठभूमि पर इस अच्छी टिप्पणी के लिए –
यह Duff's Device है। यह अनलॉकिंग लूप का एक तरीका है जो लूप पुनरावृत्ति की संख्या को अनियंत्रित कारक का सटीक बहुतायत नहीं जानता है, समय के साथ निपटने के लिए द्वितीयक फिक्स-अप लूप जोड़ने से बचाता है।
चूंकि यहां अधिकतर उत्तर सामान्य रूप से इसके बारे में सकारात्मक प्रतीत होते हैं, इसलिए मैं इसके खिलाफ बात करने जा रहा हूं।
इस कोड के साथ एक कंपाइलर लूप बॉडी को किसी भी अनुकूलन को लागू करने के लिए संघर्ष करने जा रहा है। यदि आपने कोड को सरल लूप के रूप में लिखा है तो एक आधुनिक कंपाइलर आपके लिए अनोलरिंग को संभालने में सक्षम होना चाहिए। इस तरह आप पठनीयता और प्रदर्शन को बनाए रखते हैं और लूप बॉडी पर अन्य अनुकूलन लागू होने की कुछ आशा रखते हैं।
दूसरों द्वारा संदर्भित विकिपीडिया लेख में यह भी कहा गया है कि जब यह 'पैटर्न' Xfree86 स्रोत कोड प्रदर्शन से हटा दिया गया था वास्तव में सुधार हुआ।
यह परिणाम किसी भी कोड को अनुकूलित करने के अंधेरे हाथ के विशिष्ट है जो आपको लगता है कि इसकी आवश्यकता हो सकती है। यह संकलक को अपनी नौकरी ठीक से करने से रोकता है, आपके कोड को कम पठनीय बनाता है और बग से अधिक प्रवण होता है और आमतौर पर इसे धीमा कर देता है। यदि आप चीजों को पहली जगह सही तरीके से कर रहे थे, यानी सरल कोड लिखना, फिर बाधाओं के लिए प्रोफाइलिंग करना, फिर अनुकूलित करना, आप कभी ऐसा कुछ भी इस्तेमाल नहीं करना चाहेंगे। वैसे भी एक आधुनिक सीपीयू और कंपाइलर के साथ नहीं।
यह समझना ठीक है, लेकिन अगर आप वास्तव में इसका उपयोग करते हैं तो मुझे आश्चर्य होगा।
+1। उस बदसूरत अस्पष्ट चीज़ के बारे में सही राय देने के लिए –
+1। सभी को पता होना चाहिए कि इसका उपयोग क्यों नहीं किया जाए। –
- 1. डफ का डिवाइस कैसे काम करता है?
- 2. क्या डफ की डिवाइस अन्य भाषाओं में काम करती है?
- 3. यह कोड क्या करता है?
- 4. यह सी कोड कैसे काम करता है?
- 5. यह सी कोड संकलित क्यों करता है?
- 6. यह सी कोड कैसे काम करता है?
- 7. यह (बेकार?) जावास्क्रिप्ट कोड क्या करता है?
- 8. यह xkcd कोड क्या करता है?
- 9. यह संदिग्ध फ़िशिंग कोड क्या करता है?
- 10. क्या यह सही सी ++ 0x कोड है?
- 11. क्या यह कोड मान्य सी ++ है?
- 12. क्या यह वैध सी ++ कोड है?
- 13. क्या यह कोड एक शोषण है? यह कोड क्या है?
- 14. Foo.class यह क्या करता है?
- 15. यह हास्केल कोड क्यों संकलित करता है?
- 16. यह असुरक्षित कोड कैसे काम करता है?
- 17. यह सी ++ कोड ideone.com पर SIGILL क्यों प्राप्त करता है?
- 18. यह सी ++ टेम्पलेट कोड संकलित क्यों नहीं करता है?
- 19. यह सी # कोड संकलित क्यों नहीं करता है?
- 20. यह क्या करता है?
- 21. क्या यह अनावश्यक कोड है?
- 22. 'यह' क्या संदर्भित करता है?
- 23. यह कोड स्निपेट संकलित क्यों करता है?
- 24. यह कोड कैसे डेडलॉक नहीं करता है?
- 25. एंड्रॉइड कलरफिल्टर - पोर्टर-डफ मोड
- 26. क्या कोई यह बता सकता है कि यह सी एक लाइनर क्या करता है?
- 27. यह फ़ंक्शन क्या करता है?
- 28. ऑब्जेक्ट (यह) क्या करता है?
- 29. यह वास्तव में क्या करता है? - पागल सी ++ फ़ंक्शन
- 30. query_cache_min_res_unit; यह क्या है और यह क्या करता है?
जैसा कि अन्य ने कहा, डफ की डिवाइस। अगर मैं बहुत गूढ़/obfuscated करने की ज़रूरत नहीं है, तो मैं इसे लागू नहीं करूँगा। मैं पठनीय कोड पसंद करता हूं ;-) हालांकि, यदि इस तरह के फ़ंक्शन में लपेटा गया है, तो अच्छी टिप्पणियां/दस्तावेज़ीकरण के साथ, अगर मैं इसे छूना नहीं चाहता तो मैं इसका उपयोग करूंगा। –
जहां उचित हो वहां डफ के डिवाइस का उपयोग करने में मुझे कोई समस्या नहीं होगी। यह बड़ी गहराई में बात की जाती है और सबसे बड़ी टिप्पणी एक यूआरएल होगी जहां यह पूरी तरह से बात की जाती है। – Jon
वाह - किसी ने वास्तव में ऑप्टिमाइज़ेशन के लिए डफ के डिवाइस का उपयोग करके परेशान किया है, फिर भी मॉड्यूल और विभाजन को एक शिफ्ट में नहीं बदला है ??? – Aaron