2011-09-10 5 views
7

मैं एक ऐसा गेम बना रहा हूं जिसमें मैं एक पूर्णांक या लंबे समय में बहुत अधिक डेटा संग्रहीत कर रहा हूं, क्योंकि मेरे पास बड़ी मात्रा में डेटा होगा। मैं प्रदर्शन के कारणों के लिए पूरी कक्षाओं का उपयोग नहीं करना चाहता, और उनकी आवश्यकता नहीं है। मुझे एक पूर्णांक से एक बिट पुनर्प्राप्त करने के लिए दो विधियां मिलीं। मैं सोच रहा था कि अगर कोई जानता है कि मुझे किस का उपयोग करना चाहिए या कौन सा तेज़ है।एक बिट सेट होने पर जांचने के लिए कौन सा एल्गोरिदम तेज है?

तरीके:

return (integer & (1 << bit)) != 0;

return (integer >> bit& 0x1) == 1;

+23

समयपूर्व अनुकूलन शैतान plaything – austinbv

+4

आपके लिए प्रयास करने के लिए बिल्कुल सही माइक्रो-बेंचमार्क है। दोनों को एक लाख के लूप में चलाएं और उन्हें समय दें। – Oded

+0

मैं लगभग पूरी तरह से यकीन है कि दूसरा एक सादे _wrong_ है, चाहे वह तेजी से है या नहीं ... – bdonlan

उत्तर

16

संभावना है कि आप जिस परीक्षण का परीक्षण कर रहे हैं उससे अधिक "अधिक स्थिर" है जिसके विरुद्ध आप परीक्षण कर रहे हैं। इसलिए, आप बिट के लिए स्थिरांक बना सकते हैं, जिसका अर्थ है कि आपको केवल एक बार शिफ्ट करना होगा। उदाहरण के लिए:

static final int LEFT_WALL = 1 << 1; 
static final int RIGHT_WALL = 1 << 2; 
static final int BOTTOM_WALL = 1 << 3; 
static final int TOP_WALL = 1 << 4; 
अपने पाश में

उसके बाद, आप सिर्फ

if ((integer & LEFT_WALL) != 0) 
    // left wall collision 
if ((integer & RIGHT_WALL) != 0) 
    // right wall collision 
... 

जाँच कर रहे हैं तो आप केवल पाश में दो आपरेशन कर रहे हैं (बिटवाइज़ और और तुलना), नहीं तीन (पाली, और तुलना करें)।

और अधिक महत्वपूर्ण बात यह गति लाभ की तुलना में (के रूप में टिप्पणी में कहा), यह भी यह भी बहुत कुछ स्पष्ट क्या आप के लिए प्रत्येक बिट का उपयोग कर रहे हैं, तो कोड को पढ़ने के लिए आसान है बनाता है।

+6

एक सेशन को बचाने से भी बेहतर, मैं इसे आसानी से पढ़ और समझ सकता हूं। – tvanfosson

+0

अजीब विचार। मेरे पास भी मेरे कार्यक्रम में एक्सडी के लगभग एक ही अंतिम युद्ध हैं। btw ज्यादातर लोगों कह रहे हैं कि यह एक बहुत महत्वपूर्ण Optomization नहीं है, लेकिन निश्चित समय पर मैं इस बारे में 24 मिलियन बार lol –

+1

@stas हाँ चलाने के लिए होगा और आप एक पारी कि जिस तरह से बचत कर रहे हैं, जो संभवत: μop संलयन और सह लागत के साथ शायद चक्र का एक आधा। तो यह 24 * 10^6 बार चलने से आपको लगभग 12 मिलियन चक्र या 3ghz CPU पर लगभग 4ms बचाता है। महान बचत है कि। – Voo

5

इस कार्यान्वयन निर्भर है और अपने हार्डवेयर और संकलक पर निर्भर करता है। वास्तव में किसी भी समय परीक्षण के बिना, मुझे नहीं लगता कि कोई भी कह सकता है जो बेहतर होगा।

इसके अलावा, मैं इस तरह के बारे में चिंता नहीं करता जब तक कि आपके पास ठोस सबूत न हों कि यह कोड इतना समय-महत्वपूर्ण है कि आपको इसे अनुकूलित करना होगा। समय व्यतीत करने वाला समय माइक्रोपॉटाइजिंग कोड उत्पादक होने की संभावना नहीं है जब तक कि आपको पता न हो कि यह एक प्रदर्शन बाधा है, और यदि आप कोड के अन्य हिस्सों को अनुकूलित करके अधिक बोनस प्रदर्शन नहीं प्राप्त कर सकते हैं तो मुझे आश्चर्य होगा। वास्तविक बाधाओं को देखने के लिए कोड को प्रोफाइल करने का प्रयास करें, फिर उन हिस्सों को अनुकूलित करें।

3

लगभग निश्चित रूप से कोई अंतर नहीं है।

लेकिन आपके प्लेटफॉर्म के लिए सुनिश्चित करने का एकमात्र तरीका उन दोनों को प्रोफाइल करना है। माप त्रुटि को कम करने के लिए आपको लूप में बड़ी संख्या के लिए समय (जैसे 100e6) के समय को मापने की आवश्यकता होगी।

संबंधित मुद्दे