एक 32 बिट सीपीयू एक सीपीयू है जो आमतौर पर 32 बिट मानों पर आंतरिक रूप से संचालित होता है, लेकिन इसका मतलब यह नहीं है कि यह 8/16 बिट मान पर एक ही ऑपरेशन करते समय धीमा है। उदाहरण के लिए x86, 8086 तक पिछड़ा संगत, एक रजिस्टर के अंशों पर काम कर सकता है। इसका मतलब है कि यदि रजिस्टर 32 बिट चौड़ा है, तो यह केवल पहले 16 या उस रजिस्टर के पहले 8 बिट पर ही काम कर सकता है और बिल्कुल धीमा नहीं होगा। इस अवधारणा को x86_64 द्वारा भी अपनाया गया है, जहां पंजीयक 64 बिट हैं, फिर भी वे केवल पहले 32, 16, या 8 बिट पर ही काम कर सकते हैं।
इसके अलावा x86 CPU हमेशा स्मृति से पूरी कैश लाइन लोड करते हैं, अगर पहले से ही कैश में नहीं है, और कैश लाइन 4 बाइट से भी बड़ी है (32 बिट CPUs के बजाय 8 या 16 बाइट्स के लिए) और इस प्रकार स्मृति से 2 बाइट लोड हो रहा है स्मृति से 4 बाइट लोड करने के समान ही तेज़ है। यदि स्मृति से कई मानों को संसाधित करते हैं, तो 16 बिट मान वास्तव में 32 बिट मानों से अधिक तेज़ हो सकते हैं, क्योंकि कम स्मृति स्थानान्तरण होते हैं। यदि एक कैश लाइन 8 बाइट है, तो प्रति कैश लाइन के चार 16 बिट मान हैं, फिर भी केवल दो 32 बिट मान हैं, इस प्रकार 16 बिट इन्ट्स का उपयोग करते समय आपके पास 32 बिट इन्ट्स का उपयोग करके प्रत्येक चार मानों तक एक मेमोरी एक्सेस होती है, आपके पास प्रत्येक दो मान होते हैं , जिसके परिणामस्वरूप एक बड़ी int सरणी को संसाधित करने के लिए दो बार स्थानान्तरण होता है।
अन्य सीपीयू, उदाहरण के लिए पीपीसी की तरह, एक रजिस्टर के केवल एक अंश को संसाधित नहीं कर सकते हैं, वे हमेशा पूर्ण रजिस्टर को संसाधित करते हैं। फिर भी इन CPUs में विशेष लोड ऑपरेशंस होते हैं जो उन्हें अनुमति देते हैं, उदा। स्मृति से 16 बिट मान लोड करें, इसे 32 बिट तक बढ़ाएं और इसे एक रजिस्टर में लिखें।बाद में उनके पास एक विशेष स्टोर ऑपरेशन है जो रजिस्टर से मूल्य लेता है और केवल अंतिम 16 बिट को स्मृति में संग्रहीत करता है; दोनों ऑपरेशन को केवल एक सीपीयू चक्र की आवश्यकता होती है, जैसे 32 बिट लोड/स्टोर की आवश्यकता होती है, इसलिए कोई गति अंतर नहीं होता है। और चूंकि पीपीसी केवल रजिस्टरों पर अंकगणितीय परिचालन कर सकता है (x86 के विपरीत, जो सीधे मेमोरी पर भी काम कर सकता है), यह लोड/स्टोर प्रक्रिया तब भी होती है जब आप 32 बिट इंट्स या 16 बिट इंट्स का उपयोग करते हैं।
एकमात्र नुकसान, यदि आप 32 बिट सीपीयू पर एकाधिक परिचालनों को चेन करते हैं जो केवल पूर्ण रजिस्टरों पर ही काम कर सकता है, तो यह है कि अंतिम ऑपरेशन के 32 बिट परिणाम को अगले 16 बिट पर "वापस कट" करना पड़ सकता है ऑपरेशन किया जाता है, अन्यथा परिणाम सही नहीं हो सकता है। इस तरह का एक कट बैक केवल एक ही सीपीयू चक्र है, हालांकि (एक सरल और ऑपरेशन), और कंपाइलर्स यह पता लगाने में बहुत अच्छे हैं कि इस तरह का कट बैक वास्तव में जरूरी है और इसे छोड़कर अंतिम परिणाम पर कोई प्रभाव नहीं पड़ेगा , इसलिए प्रत्येक कट के बाद इस तरह का एक कट बैक नहीं किया जाता है, यह केवल तभी किया जाता है जब वास्तव में अपरिहार्य हो। कुछ सीपीयू विभिन्न "उन्नत" निर्देश प्रदान करते हैं जो इस तरह के कटौती को अनावश्यक बनाते हैं और मैंने अपने जीवन में बहुत सारे कोड देखे हैं, जहां मैंने ऐसी कटौती की उम्मीद की थी, फिर भी जेनरेट किए गए असेंबली कोड को देखते हुए, कंपाइलर को एक रास्ता मिला इसे पूरी तरह से टालें।
तो यदि आप यहां एक सामान्य नियम की अपेक्षा करते हैं, तो मुझे आपको निराश करना होगा। न तो कोई यह सुनिश्चित करने के लिए कह सकता है कि 16 बिट ऑपरेशंस 32 बिट ऑपरेशंस के लिए समान रूप से तेज़ हैं, और न ही कोई यह सुनिश्चित कर सकता है कि 32 बिट ऑपरेशंस हमेशा तेज होंगे। यह भी निर्भर करता है कि आपका कोड वास्तव में उन संख्याओं के साथ क्या कर रहा है और यह कैसा चल रहा है। मैंने बेंचमार्क देखा है जहां 16 बिट ऑपरेशंस के साथ 32 बिट ऑपरेशंस कुछ 32 बिट सीपीयू पर एक ही कोड की तुलना में तेज़ थे, हालांकि मैंने पहले से ही विपरीत होने को देखा है। यहां तक कि एक कंपाइलर से दूसरे में स्विच करना या आपके कंपाइलर संस्करण को अपग्रेड करना पहले से ही सब कुछ बदल सकता है। मैं केवल निम्नलिखित कह सकता हूं: जो भी दावा करता है कि शॉर्ट्स के साथ काम करना इंट्स के साथ काम करने से काफी धीमा है, कृपया उस दावे के लिए एक नमूना स्रोत कोड प्रदान करें और सीपीयू और कंपाइलर का नाम परीक्षण के लिए इस्तेमाल किया जाए, क्योंकि मैंने कभी ऐसा कुछ अनुभव नहीं किया है पिछले 10 वर्षों के बारे में। ऐसी कुछ स्थितियां हो सकती हैं, जहां स्याही के साथ काम करना शायद 1-5% तेज हो, फिर भी 10% से कम कुछ भी "महत्वपूर्ण" नहीं है और सवाल यह है कि, कुछ मामलों में स्मृति को दो बार बर्बाद करना उचित है क्योंकि यह आपको खरीद सकता है 2% प्रदर्शन? मुझे ऐसा नहीं लगता।
डुप्लिकेट प्रश्न। [.NET इंटीजर बनाम Int16?] (Http://stackoverflow.com/questions/129023/net-integer-vs-int16#137625) देखें (यह .NET लेबल है, लेकिन यह हार्डवेयर आर्किटेक्चर के बारे में वही लागू होता है।) –
@ जोनएडम्स: यह बिल्कुल किसी भी तरह से कोई डुप्लिकेट नहीं है, क्योंकि .NET स्वयं का एक ढांचा है और जो कुछ भी सच है, .NET के लिए कुछ भी सही नहीं हो सकता है लेकिन .NET। कुछ सीपीयू पर 32 बिट ऑप्स .NET में तेजी से हो सकते हैं (चूंकि .NET को इसके लिए अनुकूलित किया गया है), फिर भी जब सादा सी कोड लिखते हैं, तो 64 बिट ओप उस सीपीयू पर 32 बिट ऑप्स से अधिक तेज़ हो सकते हैं (क्योंकि सी कंपाइलर मई 32 बिट के मुकाबले 64 बिट के लिए कोड को बेहतर अनुकूलित करने में सक्षम हो)। – Mecki