आप एक बूलियन स्थिति को जावा में एक पूर्णांक प्रकार के बिना कैसे परिवर्तित करते हैं या संकलित बाइट-कोड और JITed मशीन-कोड [डुप्लिकेट] में कूदते हैं
उदाहरण के लिए यहाँ C / C ++ के लिए दिया गया है :
... यह एक नई तकनीक के कारण "ब्लॉकक्विक्सोर्ट: हाउ ब्रांच मिसप्रिंटेड्स क्विकॉर्ट को प्रभावित नहीं करता है" स्टीफन एडेलकम्प और आर्मिन वीस द्वारा किया गया है। संक्षेप में, हम उन तत्वों के सूचकांकों के छोटे बफ़र्स (पूरी तरह से एल 1 कैश में) का उपयोग करके शाखा भविष्यवक्ता को बायपास करते हैं जिन्हें स्वैप करने की आवश्यकता होती है। हम इन बफ़र्स को एक शाखा-मुक्त तरीके से भरते हैं जो कि बहुत ही सुंदर है (छद्मकोश में):
buffer_num = 0; buffer_max_size = 64;
for (int i = 0; i < buffer_max_size; ++i) {
// With branch:
if (elements[i] < pivot) { buffer[buffer_num] = i; buffer_num++; }
// Without:
buffer[buffer_num] = i; buffer_num += (elements[i] < pivot);
}
जावा को बिना शाखा या कूद के कैसे प्राप्त किया जा सकता है?
जवाब
दुर्भाग्य से, जावा में यह संभव नहीं है।
यह समझने के लिए कि, जेवीएम के भीतर जावा प्रकारों के पीछे मूल प्रकारों पर एक नज़र डालें ।
सूचना:
- जावा
intप्राइमिटिव (jint) 32-बिट हस्ताक्षरित पूर्णांकों द्वारा समर्थित हैं। - जावा
booleanप्रिमिटिव (jboolean) 8-बिट अहस्ताक्षरित पूर्णांक द्वारा समर्थित हैं।
कारण है कि आप दोनों के बीच एक कूद या शाखा पर भी कास्ट नहीं कर सकता कि कलाकारों जरूरी प्रवेश किए अहस्ताक्षरित तुलना शामिल है, और प्रस्थान किए अहस्ताक्षरित तुलना है जरूरी शामिल कूदता है या शाखाओं। का जवाब इस सवाल क्यों का एक अच्छा विवरण उपलब्ध कराती है।
असल में, हार्डवेयर स्तर पर, प्रोसेसर स्वयं एक ही ऑपरेशन में हस्ताक्षरित-अहस्ताक्षरित तुलना करने में सक्षम नहीं है। प्रोसेसर को हस्ताक्षरित-हस्ताक्षरित और अहस्ताक्षरित-अहस्ताक्षरित तुलना के संदर्भ में करना पड़ता है। इसके लिए लॉजिक ट्री की आवश्यकता होती है, और इसलिए जंपर्स या ब्रांचिंग की भी आवश्यकता होती है।
टी एल; डॉ: int करने के लिए booleanरूपांतरण नहीं जावा में छलांग या देशी स्तर पर शाखाओं के बिना, किया जा सकता है क्योंकि booleanअहस्ताक्षरित है और intहस्ताक्षरित किया गया है और इसलिए एक रूपांतरण पर हस्ताक्षर किए-अहस्ताक्षरित तुलना की आवश्यकता है।