2011-11-06 20 views
13

मैं एक 2-प्लेयर गेम को कार्यान्वित कर रहा हूं जो कि कसकर लूप में सचमुच सैकड़ों हजारों बार चलता है, फिर प्रदर्शन सर्वोपरि होता है।जावा एनम्स का प्रदर्शन?

मेरे कोड वास्तव में इस तरह दिखता है:

public class Table { 
    private final int WHITE_PLAYER = +1; 
    private final int BLACK_PLAYER = -1; 

    private final int currentPlayer; 
    private final int otherPlayer; 

    ... 
} 

मैं सोच रहा था अगर मैं किसी भी प्रदर्शन हिट मिलेगा मैं एक enum

public enum Players { 
    WhitePlayer, 
    BlackPlayer 
} 
के रूप में परिभाषित करने के लिए

private final int WHITE_PLAYER = +1; 
private final int BLACK_PLAYER = -1; 

को बदलने के लिए चुनते हैं

मुझे यह विचार था कि enums केवल पूर्णांक स्थिरांक पर वाक्य रचनात्मक चीनी थे, और एक ले एक टेस्ट एनम के साथ उत्पन्न बाइटकोड पर शीशा लगाना, साथ ही कोड को कॉल करने से यह संकेत मिलता है कि उनका उपयोग करना एक स्थिर विधि कॉल बनाने जैसा ही है, लेकिन कुछ एनम इंफ्रास्ट्रक्चर के लिए जो इसे पहले चलाने पर स्थापित किया जाता है।

क्या मेरा मानना ​​है कि यह वास्तव में स्थिर स्थिरांक के रूप में enums का उपयोग करने के लिए समान है या क्या मुझे यहां कुछ याद आ रही है?

+0

प्रति घंटे इकाई के हजारों बार? –

+1

अच्छा सवाल। मैं कुछ दिनों के लिए गेम (मैं अनुमान लगाता हूं) चलाऊंगा, इसलिए तेज़ी से वे खत्म हो जाएंगे, जितनी जल्दी मैं उनके परिणामों का विश्लेषण करूँगा। मैं लोगों से यह पूछता हूं कि प्रदर्शन ट्यूनिंग थ्रेड के खिलाफ सामान्य युद्ध में इसे चालू न करें .. –

+6

अगर ऐसा लगता है कि यह वास्तव में मीटरबद्ध है, तो मैं इसे मापूंगा। –

उत्तर

20

माइक्रो-बेंचमार्क में, हां, पूर्णांक निरंतर समानता की जांच एनम निरंतर समानता की जांच करने से तेज होगी।

हालांकि, वास्तविक एप्लिकेशन में, अकेले एक गेम दें, यह पूरी तरह से अप्रासंगिक होगा। एडब्ल्यूटी उपप्रणाली (या किसी अन्य जीयूआई टूलकिट) में जो चीजें हो रही हैं, वे परिमाण के कई आदेशों से इन सूक्ष्म प्रदर्शन विचारों को बौने करते हैं।

संपादित

मुझे एक छोटे से तो विस्तृत करते हैं।

एक enum तुलना इस प्रकार है:

aload_0 
getstatic 
if_acmpne 

एक छोटे पूर्णांक के लिए एक पूर्णांक तुलना इस प्रकार है:,

iload_0 
iconst_1 
if_icmpne 

जाहिर है, प्रथम, द्वितीय की तुलना में अधिक काम है, हालांकि अंतर काफी छोटा है।

भागो निम्नलिखित परीक्षण का मामला:

class Test { 

    static final int ONE = 1; 
    static final int TWO = 2; 

    enum TestEnum {ONE, TWO} 

    public static void main(String[] args) { 
     testEnum(); 
     testInteger(); 
     time("enum", new Runnable() { 
      public void run() { 
       testEnum(); 

      } 
     }); 
     time("integer", new Runnable() { 
      public void run() { 
       testInteger(); 
      } 
     }); 
    } 

    private static void testEnum() { 
     TestEnum value = TestEnum.ONE; 
     for (int i = 0; i < 1000000000; i++) { 
      if (value == TestEnum.TWO) { 
       System.err.println("impossible"); 
      } 
     } 
    } 

    private static void testInteger() { 
     int value = ONE; 
     for (int i = 0; i < 1000000000; i++) { 
      if (value == TWO) { 
       System.err.println("impossible"); 
      } 
     } 
    } 

    private static void time(String name, Runnable runnable) { 
     long startTime = System.currentTimeMillis(); 
     runnable.run(); 
     System.err.println(name + ": " + (System.currentTimeMillis() - startTime) + " ms"); 
    } 
} 

और आप पाएंगे कि enum तुलना में धीमी है कि पूर्णांक तुलना, मेरे मशीन पर चारों ओर 1.5% द्वारा।

मैं बस इतना कह रहा था कि यह अंतर वास्तविक अनुप्रयोग में कोई फर्क नहीं पड़ता है ("समयपूर्व अनुकूलन सभी बुराइयों की जड़ है")। मैं पेशेवर आधार पर प्रदर्शन समस्याओं से निपटता हूं (मेरी प्रोफ़ाइल देखें) और मैंने कभी ऐसा गर्म स्थान नहीं देखा है जिसे इस तरह से पता लगाया जा सकता है।

+2

"हालांकि, एक असली आवेदन में, अकेले एक खेल दें, यह पूरी तरह से अप्रासंगिक होगा। एडब्ल्यूटी उपप्रणाली (या किसी अन्य जीयूआई टूलकिट) में जो चीजें हो रही हैं, वे परिमाण के कई आदेशों से इन सूक्ष्म प्रदर्शन विचारों को बौने करते हैं।" तो आप मान रहे हैं कि वास्तव में, इस गेम के लिए एक जीयूआई है? पूरी तरह से झूठा! –

+1

32-बिट पूर्णांक के साथ 32-बिट संदर्भ (एनम पहचान समानता) की तुलना करना तेज़ क्यों होगा? (जाहिर है आप '.equals' विधि का उपयोग नहीं करेंगे) –

+1

उत्तर गलत है, डाउनवोट। – EJP

8

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

+4

अच्छा है! सवाल का जवाब नहीं दे रहा है! –

+2

यह आपके प्रश्न का उत्तर देता है, आप बस समझ में नहीं आते हैं या जवाब पसंद नहीं करते हैं। अच्छा, यह तुम्हारी पसंद है। – unbeli

+0

यह बिल्कुल सही जवाब है। आप इनट्स और एनम्स का उपयोग करने के बीच अंतर बताने में सक्षम नहीं होंगे। – MeBigFatGuy

2

JIT इस अप्रासंगिक तरह बातें बनाने के लिए बहुत कुछ अनुकूलन के बाद यह कुछ समय से चल रहा है जाएगा

उल्लेख करने के लिए नहीं enums अधिक पठनीय और अधिक सरल कर रहे हैं आप अपने कोड में कोई त्रुटि बनाना चाहिए

+0

क्या चीजों को अनुकूलित करेगा? – EJP

0

आपका धारणा सही है। जावा सुनिश्चित करता है कि enum का केवल एक उदाहरण है ताकि == इन्स की तुलना में उतना ही कुशल हो।

+0

उत्तर गलत है, डाउनवोट। –

+0

@IngoKegel बिल्कुल सही में गलत है? – EJP

+0

मेरे उत्तर में संपादन देखें –

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