दिलचस्प पोस्ट
कस्टम JSON deserializer जीएसएन का उपयोग कर अजगर * ऑपरेटर के लिए उचित नाम? प्रमुख सी # डीआई / आईओसी चौखटे की तुलना कैसे की जाती है? कितने पंक्तियों का चयन करने के लिए <h: selectBooleanCheckbox> में <h: dataTable> का उपयोग करें? संभावित खतरनाक अनुरोध। क्लाइंट से फ़ार्म मान का पता चला है एंड्रॉइड कैमरा: डाटा इन्टेंट रिटर्न नल गतिशील रूप से फ़ंक्शन पैरामीटर नाम / मूल्य कैसे प्राप्त करें? फोन नंबर मान्यता के लिए एक व्यापक regex जावा क्लास जो नक्शा लागू करता है और प्रविष्टि क्रम रखता है? आप HQL में एक सीमा क्वेरी कैसे करते हैं? सुडो एको "कुछ" >> / etc / विशेषाधिकारितफ़ाइल काम नहीं कर रहा है … क्या कोई विकल्प है? डबल। समानता के लिए एप्सिलॉन, से बड़ा, कम से कम, या उसके बराबर या उससे अधिक के बराबर मैं सी # में एक फ़ाइल को स्ट्रीम कैसे सहेजूं? PHP के त्रुटि लॉग XAMPP में कहाँ रहते हैं? विंडो बनाम पेज बनाम UserControl WPF नेविगेशन के लिए?

क्या x86 के MOV वास्तव में "मुफ़्त" हो सकता है? मैं इस सब पर पुन: उत्पन्न क्यों नहीं कर सकता हूं?

मैं देख रहा हूं कि लोगों का दावा है कि एमओवी निर्देश एक्स 86 में मुफ्त हो सकता है, क्योंकि रजिस्टर का नाम बदलना

मेरे जीवन के लिए, मैं इसे एक ही परीक्षण के मामले में सत्यापित नहीं कर सकता। हर परीक्षण का मामला मैं इसे खारिज करने की कोशिश करता हूं

उदाहरण के लिए, यहां कोड है जिसे मैं विजुअल सी ++ के साथ संकलित कर रहा हूं:

#include <limits.h> #include <stdio.h> #include <time.h> int main(void) { unsigned int k, l, j; clock_t tstart = clock(); for (k = 0, j = 0, l = 0; j < UINT_MAX; ++j) { ++k; k = j; // <-- comment out this line to remove the MOV instruction l += j; } fprintf(stderr, "%d ms\n", (int)((clock() - tstart) * 1000 / CLOCKS_PER_SEC)); fflush(stderr); return (int)(k + j + l); } 

यह लूप के लिए निम्नलिखित असेंबली कोड का उत्पादन करता है (इस पर आपको लगता है कि आप इसे बनाना चाहते हैं, आपको स्पष्ट रूप से Visual C ++ की आवश्यकता नहीं है):

 LOOP: add edi,esi mov ebx,esi inc esi cmp esi,FFFFFFFFh jc LOOP 

अब मैं इस कार्यक्रम को कई बार चलाता हूं, और जब एमओवी निर्देश हटा दिया जाता है तो मैं एक बहुत सुसंगत 2% अंतर देखता हूं:

 Without MOV With MOV 1303 ms 1358 ms 1324 ms 1363 ms 1310 ms 1345 ms 1304 ms 1343 ms 1309 ms 1334 ms 1312 ms 1336 ms 1320 ms 1311 ms 1302 ms 1350 ms 1319 ms 1339 ms 1324 ms 1338 ms 

तो क्या देता है? क्यों नहीं MOV "मुफ़्त" है? क्या यह लूप एक्स 86 के लिए बहुत जटिल है?
क्या कोई ऐसा उदाहरण है जो एमओवी को मुक्त होने का दावा कर सकता है जैसे लोगों का दावा है?
यदि ऐसा है, तो ये क्या है? और अगर नहीं, तो हर कोई एमओवी का दावा क्यों करता है?

वेब के समाधान से एकत्रित समाधान "क्या x86 के MOV वास्तव में "मुफ़्त" हो सकता है? मैं इस सब पर पुन: उत्पन्न क्यों नहीं कर सकता हूं?"

यहां दो छोटे परीक्षण दिए गए हैं जो मुझे विश्वास है कि mov-elimination के लिए निश्चित रूप से सबूत दिखाते हैं:

 __loop1: add edx, 1 add edx, 1 add ecx, 1 jnc __loop1 

बनाम

 __loop2: mov eax, edx add eax, 1 mov edx, eax add edx, 1 add ecx, 1 jnc __loop2 

अगर mov एक निर्भरता श्रृंखला में एक चक्र जोड़ा, यह उम्मीद है कि दूसरे संस्करण प्रति पुनरावृत्ति के बारे में 4 चक्र लेता है। मेरे Haswell पर, दोनों दोहराव के अनुसार लगभग 2 चक्र लेते हैं, जो बिना मूव-उन्मूलन के नहीं हो सकता।