2015-01-20 12 views
30

जावा में 6 नीचे कोड अपेक्षित के रूप में चल रहा है लेकिन जावा 8 में इसमें अधिक समय लग रहा है। दिलचस्प हिस्सा यह है कि घटकों को घटकों को सक्षम और अक्षम करने के लिए घटक एक ही विधि setEnable() का उपयोग करते हैं, लेकिन अक्षम करने योग्य कॉल सक्षम करने की तुलना में काफी अधिक समय लेता है, लगभग दोगुना। जावा 8 में अक्षम करना जावा 1.6 में से एक से अधिक समय ले रहा है। सवाल यह है कि ऐसा क्यों होता है? क्या यह जावा 8 की एक प्रदर्शन समस्या है? कर रहे हैं जावा 8 के लिए परिणामजावा 8 की तुलना में जावा 8 खराब जीयूआई प्रदर्शन 6

Sun Microsystems Inc. 1.6.0_45 
    Initializing GUI 
    GUI initialized in 1105 ms 
    Disabling 
    Disabled in 687 ms 
    Enabling 
    Enabled in 375 ms 

यहाँ:

Oracle Corporation 1.8.0_25 
    Initializing GUI 
    GUI initialized in 604 ms 
    Disabling 
    Disabled in 6341 ms 
    Enabling 
    Enabled in 370 ms 

कोड:

import java.awt.Component; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 

public class TestGUI extends JFrame implements ActionListener { 

    private static final long serialVersionUID = 1L; 

    public TestGUI() { 
     initGUI(); 
    } 

    public void actionPerformed(ActionEvent e) { 
     String text; 
     if(e.getActionCommand().equals("Enable-ALL")){ 
      enableAll(); 
      text= "Disable-ALL"; 
     } 
     else{ 
      disableAll(); 
      text= "Enable-ALL"; 
     } 
     ((JButton)e.getSource()).setText(text); 
     ((JButton)e.getSource()).setEnabled(true); 

    } 


    private void initGUI() { 
     long m = System.currentTimeMillis(); 
     System.out.println("Initializing GUI"); 
     setTitle(System.getProperty("java.vendor") + " " + System.getProperty("java.version")); 
     setLayout(new FlowLayout()); 

     JButton b = new JButton("Disable-ALL "); 
     b.addActionListener(this); 
     add(b); 

     for (int i = 1; i < 10001; i++) { 
      b = new JButton("Button " + i); 
      add(b); 
     } 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(600, 600); 
     setVisible(true); 
     m = System.currentTimeMillis() - m; 
     System.out.println("GUI initialized in " + m + " ms"); 
    } 

    private void disableAll() { 
     long m = System.currentTimeMillis(); 
     System.out.println("Disabling"); 
     for (Component c : getContentPane().getComponents()) { 
      c.setEnabled(false); 
     } 

     m = System.currentTimeMillis() - m; 
     System.out.println("Disabled in " + m + " ms"); 
    } 

    private void enableAll() { 
     long m = System.currentTimeMillis(); 
     System.out.println("Enabling"); 
     for (Component c : getContentPane().getComponents()) { 
      c.setEnabled(true); 
      invalidate(); 
     } 
     m = System.currentTimeMillis() - m; 
     System.out.println("Enabled in " + m + " ms"); 
    } 

    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       System.out.println(System.getProperty("java.vendor") + " " 
         + System.getProperty("java.version")); 
       new TestGUI(); 
      } 
     }); 
    } 
} 
+4

रास्ता के लिए प्रदर्शन को मापने के नहीं है यही कारण है कि जावा अनुप्रयोगों। वर्तमान में आप कक्षा लोडिंग समय लागत शामिल करते हैं जो केवल एक बार होता है। माइक्रो बेंचमार्क – Vic

+4

के लिए जेएमएच लाइब्रेरी का प्रयोग करें हाँ आप सही हैं यह बेंचमार्क नहीं है .. हालांकि उपयोगकर्ता के रूप में मैं धीमा महसूस कर सकता हूं। जैसा कि आप जावा 1.8 अक्षम कर सकते हैं 6341 एमएस में सक्षम है जबकि 370 एमएस सक्षम है। वे एक ही विधि setEnable() का उपयोग कर रहे हैं। ऐसा क्यों हुआ? – mbsau

+2

6 सेकंड बहुत समय है - यदि आप इसे कुछ बार चलाते हैं तो क्या आपको समान आंकड़े मिलते हैं? – assylias

उत्तर

24

मेरी प्रोफाइलर के अनुसार,

यहाँ जावा 6 के लिए परिणाम हैं ऑपरेशन Thread.holdsLock विधि में अधिकांश समय बिताता है, जो वास्तव में एक महंगा ऑपरेशन हो सकता है, जिसेद्वारा बुलाया जाता हैजिसे अप्रत्यक्ष रूप से Component.updateCursorImmediately कहा जाता है।

आम तौर पर, ऑपरेशन से पहले getContentPane().setVisible(false); पर कॉल करके कई घटकों को अपडेट करते समय महंगा दृश्य अपडेट से बच सकते हैं और getContentPane().setVisible(true); ठीक बाद में, उदा।

private void disableAll() { 
    long m = System.currentTimeMillis(); 
    System.out.println("Disabling"); 
    getContentPane().setVisible(false); 
    for (Component c : getContentPane().getComponents()) { 
     c.setEnabled(false); 
    } 
    getContentPane().setVisible(true); 

    m = System.currentTimeMillis() - m; 
    System.out.println("Disabled in " + m + " ms"); 
} 

आप देखेंगे कि ऐसी समस्याएं गायब हो जाएंगी, इस पर ध्यान दिए बिना कि किस तरह के दृश्य अपडेट में समस्या का विस्तार होता है।

तो तुम, के बारे में सोचने के लिए कैसे सही ढंग से बेंचमार्क यहाँ की जरूरत नहीं है कि यह मायने रखती है जब आपरेशन सेकंड लेता है, लेकिन मैं System.currentTimeMillis() और System.nanoTime() के बीच अंतर सीखने की सलाह देते हैं के रूप में बाद के मापने गुजरे के लिए सही उपकरण है समय

+0

धन्यवाद होल्गर। हमारे आवेदन में उपरोक्त कोड नमूने के रूप में देखने में कई घटक हैं। यह छोटा कोड शांति हमारे गुई प्रदर्शन समस्या को पुन: उत्पन्न करती है। हमारी वास्तविक समस्या यह है कि जब डेटा के बाद घटक का अद्यतन स्वयं (या फ़्रेम) प्रदर्शित होता है जो सर्वर से प्राप्त होता है। सर्वर को एसिंक्रनाइज़ तरीके से सर्वर से प्राप्त हो रहा है। फ्रेम्स प्रारंभ होने पर हो सकता है कि एक से अधिक डेटा फ़ेच अनुरोध सर्वर पर जाएं। तो इन परिस्थितियों में CONTentPane() सेट करने योग्य() विधियों को पाने के लिए कोई निश्चित बिंदु नहीं है। क्या मुझे वास्तव में कोड बदलने की ज़रूरत है? क्योंकि यह जावा 1.6 में अच्छा काम कर रहा है। – mbsau

+4

आप इस परिमाण की प्रदर्शन समस्या के लिए ओरेकल को एक बग रिपोर्ट दर्ज कर सकते हैं। लेकिन अगर यह अगले संस्करण में तय किया गया है तो आपको समस्या से प्रभावित संस्करण का उपयोग कर उपयोगकर्ताओं को संभालने का तरीका तय करना होगा। मेरे लिए यह पहली बार नहीं है कि एक अद्यतन पहले से सरल ऑपरेशन को एक लंबे समय में बदल देता है, जो कि मामूली अपडेट में भी हो सकता है। तो बुरी खबर यह है कि, जीयूआई प्रोग्रामिंग काम-आसपास प्रोग्रामिंग है। मुझे अधिक विशिष्ट सलाह देने के लिए आपके आवेदन के बारे में पर्याप्त जानकारी नहीं है। लेकिन अगर आप एक बिंदु पर EDT पर कुछ कार्रवाई डाल करने के लिए ताकि आप इसे पर नियंत्रण ... – Holger

+3

1. AWT/घुमाओ, सूर्य से जावा के अधिग्रहण से Oracle द्वारा नजरअंदाज कर दिया है 2. ग्राफिक्स एल्गोरिथ्म, प्रतिपादन किया है, तो आप एक अतुल्यकालिक घटना मिलता है लॉजिक्स, prehistorics है 3. कोर (AWT/घुमाओ एपीआई का उपयोग करके सभी मामलों की तुलना में बेहतर संभव में) GPU के लिए लॉजिक्स और काफी अच्छा optimalizations प्रतिपादन आज के निकट के साथ आज JavaFX के लिए अनुकूलित है, यहाँ 4. याद आ रही के साथ कुछ अर्द्ध कीड़े correspondings है पुरानी एपीआई के हिस्से के लिए अनुकूलन – mKorbel

5

मैं ठीक से समझ करने का मौका नहीं मिला है, लेकिन यह घटना से निपटने 8. में परिवर्तित हो सकता है की तरह लगता है पहले प्रक्रिया को गति माता पिता अक्षम करना:

getContentPane().setEnabled(false); 
for (Component c : getContentPane().getComponents()) { 
    c.setEnabled(false); 
} 
getContentPane().setEnabled(true); 
संबंधित मुद्दे