मौजूदा उत्तर वास्तव में चीजों के हार्डवेयर पक्ष को संबोधित नहीं करते हैं, इसलिए यहां उस कोण पर थोड़ा सा है। पारंपरिक ज्ञान यह है कि गुणा और भाग स्थानांतरण की तुलना में बहुत धीमा है, लेकिन वास्तविक कहानी आज अधिक बारीक है।
उदाहरण के लिए, यह निश्चित रूप से सच है कि हार्डवेयर में लागू करने के लिए गुणा एक अधिक जटिल ऑपरेशन है, लेकिन यह हमेशा धीमा नहीं होता है । जैसा कि यह पता चला है, (या सामान्य रूप से किसी भी बिटवाइज़ ऑपरेशन) की add
तुलना में लागू करने के लिए काफी अधिक जटिल है xor
, लेकिन add
(और sub
) आमतौर पर अपने ऑपरेशन के लिए पर्याप्त ट्रांजिस्टर समर्पित करते हैं जो बिटवाइज़ ऑपरेटरों के समान ही तेजी से समाप्त होते हैं। तो आप बस गति के लिए एक गाइड के रूप में हार्डवेयर कार्यान्वयन जटिलता को नहीं देख सकते हैं।
तो चलिए विस्तार से देखते हैं "पूर्ण" ऑपरेटरों की तरह गुणा और स्थानांतरण।
स्थानांतरण
लगभग सभी हार्डवेयर पर, एक स्थिर राशि (यानी, एक राशि जो संकलक निर्धारित समय पर निर्धारित कर सकता है) द्वारा तेज है । विशेष रूप से, यह आमतौर पर एक चक्र की विलंबता के साथ और 1 प्रति चक्र या बेहतर के थ्रूपुट के साथ होगा। कुछ हार्डवेयर पर (उदाहरण के लिए, कुछ इंटेल और एआरएम चिप्स), एक स्थिर द्वारा कुछ बदलाव "मुक्त" भी हो सकते हैं क्योंकि उन्हें दूसरे निर्देश में बनाया जा सकता है ( lea
इंटेल पर, एआरएम में पहले स्रोत की विशेष स्थानांतरण क्षमता)।
एक चर राशि से स्थानांतरण एक ग्रे क्षेत्र का अधिक है। पुराने हार्डवेयर पर, यह कभी-कभी बहुत धीमा था, और गति पीढ़ी से पीढ़ी तक बदल गई। उदाहरण के लिए, इंटेल की P4 की प्रारंभिक रिलीज पर, एक चर राशि द्वारा स्थानांतरण बेहद धीमी गति से था - शिफ्ट राशि के लिए आनुपातिक समय की आवश्यकता! उस प्लेटफ़ॉर्म पर, पारियों को बदलने के लिए गुणा का उपयोग करना लाभदायक हो सकता है (यानी, दुनिया उलट गई है)। पूर्व इंटेल चिप्स पर, साथ ही बाद की पीढ़ियों पर, एक चर राशि द्वारा स्थानांतरण इतना दर्दनाक नहीं था।
वर्तमान इंटेल चिप्स पर, एक चर राशि द्वारा स्थानांतरण विशेष रूप से तेज़ नहीं है, लेकिन यह या तो भयानक नहीं है। चर पारियों की बात आती है तो x86 आर्किटेक्चर हैमस्ट्रिंग है, क्योंकि उन्होंने ऑपरेशन को एक असामान्य तरीके से परिभाषित किया था: 0 की शिफ्ट मात्रा में स्थिति के झंडे को संशोधित नहीं किया जाता है, लेकिन अन्य सभी बदलाव करते हैं। यह झंडे रजिस्टर के कुशल नामकरण को रोकता है क्योंकि यह तब तक निर्धारित नहीं किया जा सकता है जब तक कि शिफ्ट निष्पादित नहीं हो जाता है कि क्या बाद के निर्देशों को शिफ्ट द्वारा लिखे गए शर्त कोड, या कुछ पूर्व निर्देश को पढ़ना चाहिए। इसके अलावा, झंडे केवल झंडे रजिस्टर के हिस्से को लिखते हैं, जिससे आंशिक झंडे स्टाल हो सकते हैं।
इसके बाद की स्थिति यह है कि हाल ही के इंटेल आर्किटेक्चर पर, एक चर राशि द्वारा शिफ्ट में तीन "माइक्रो-ऑपरेशंस" होते हैं, जबकि अधिकांश अन्य सरल ऑपरेशन (ऐड, बिटवाइज़ ऑप्स, यहां तक कि गुणा) केवल 1 लेते हैं। इस तरह की शिफ्ट हर 2 चक्र में एक बार सबसे अधिक निष्पादित हो सकती है। ।
गुणन
आधुनिक डेस्कटॉप और लैपटॉप हार्डवेयर में रुझान गुणन को एक तेज ऑपरेशन बनाना है। हाल ही में इंटेल और एएमडी चिप्स पर, वास्तव में, हर चक्र में एक गुणा जारी किया जा सकता है (हम इस पारस्परिक प्रवाह को कहते हैं )। विलंबता , तथापि, एक गुणा के 3 चक्र है। तो इसका मतलब है कि आप इसे शुरू करने के बाद किसी भी दिए गए गुणन 3 चक्र का परिणाम प्राप्त करते हैं , लेकिन आप हर चक्र में एक नया गुणन शुरू करने में सक्षम हैं। कौन सा मूल्य (1 चक्र या 3 चक्र) अधिक महत्वपूर्ण है, आपके एल्गोरिथ्म की संरचना पर निर्भर करता है। यदि गुणा एक महत्वपूर्ण निर्भरता श्रृंखला का हिस्सा है, तो विलंबता महत्वपूर्ण है। यदि नहीं, तो पारस्परिक थ्रूपुट या अन्य कारक अधिक महत्वपूर्ण हो सकते हैं।
वे महत्वपूर्ण हैं कि आधुनिक लैपटॉप चिप्स (या बेहतर) पर, गुणा एक तेज ऑपरेशन है, और 3 या 4 निर्देश अनुक्रम की तुलना में तेज होने की संभावना है जो एक संकलक ताकत कम पारियों के लिए "गोलाई" को सही करने के लिए जारी करेगा। इंटेल पर परिवर्तनशील बदलावों के लिए, उपर्युक्त मुद्दों के कारण गुणा को भी आमतौर पर पसंद किया जाएगा।
छोटे फॉर्म-फैक्टर प्लेटफार्मों पर, गुणन अभी भी धीमा हो सकता है, क्योंकि पूर्ण और तेज 32-बिट या विशेष रूप से 64-बिट गुणक के निर्माण में बहुत अधिक ट्रांजिस्टर और शक्ति लगती है। यदि कोई हाल ही में मोबाइल चिप्स पर गुणा के प्रदर्शन के विवरण के साथ भर सकता है तो यह बहुत सराहना की जाएगी।
फूट डालो
विभाजित करना गुणन की तुलना में अधिक जटिल ऑपरेशन, हार्डवेयर-वार दोनों है, और वास्तविक कोड में भी बहुत कम सामान्य है - जिसका अर्थ है कि कम संसाधनों को इसके लिए आवंटित किया जाता है। आधुनिक चिप्स में रुझान अभी भी तेजी से डिवाइडर की ओर है, लेकिन यहां तक कि आधुनिक टॉप-ऑफ-द-लाइन चिप्स एक विभाजन करने के लिए 10-40 चक्र लेते हैं, और वे केवल आंशिक रूप से पाइपलाइज्ड होते हैं। सामान्य तौर पर, 64-बिट डिवाइसेज़ 32-बिट डिवाइसेज़ की तुलना में धीमे होते हैं। अधिकांश अन्य परिचालनों के विपरीत, विभाजन तर्कों के आधार पर चक्रों की एक चर संख्या ले सकता है।
विभाजनों से बचें और पाली के साथ बदलें (या संकलक को ऐसा करने दें, लेकिन आपको विधानसभा की जांच करने की आवश्यकता हो सकती है) यदि आप कर सकते हैं!