Trong Java 6 dưới đây mã đang chạy như mong đợi nhưng trong Java 8 nó đang mất nhiều thời gian hơn. Phần thú vị là các thành phần sử dụng cùng phương thức setEnable()
để kích hoạt và vô hiệu hóa các thành phần, nhưng cuộc gọi vô hiệu hóa mất nhiều thời gian hơn kích hoạt cho phép, gần gấp đôi. Vô hiệu hóa trong Java 8 mất nhiều thời gian hơn so với một trong Java 1.6. Câu hỏi đặt ra là tại sao điều này lại xảy ra? Đây có phải là vấn đề về hiệu năng của Java 8 không?Java 8 kém hiệu suất GUI so với Java 6
Dưới đây là các kết quả cho Java 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
Dưới đây là các kết quả cho Java 8:
Oracle Corporation 1.8.0_25
Initializing GUI
GUI initialized in 604 ms
Disabling
Disabled in 6341 ms
Enabling
Enabled in 370 ms
Mã:
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();
}
});
}
}
Đó không phải là cách để đo lường hiệu suất cho Các ứng dụng Java. Hiện tại bạn bao gồm chi phí thời gian tải lớp chỉ xảy ra một lần. Sử dụng thư viện JMH cho các tiêu chuẩn vi mô – Vic
Có bạn là đúng này không phải là một điểm chuẩn .. Tuy nhiên Là một người dùng tôi có thể cảm thấy sự chậm chạp. Như bạn có thể thấy trong Java 1.8 vô hiệu hóa là trong 6341 ms trong khi kích hoạt là 370 ms. Họ đang sử dụng cùng phương thức setEnable(). Tại sao điều này xảy ra? – mbsau
6 giây là rất nhiều thời gian - bạn có nhận được các số liệu tương tự nếu bạn chạy nó một vài lần không? – assylias