gpt4 book ai didi

与 Java 6 相比,Java 8 较差的 GUI 性能

转载 作者:IT老高 更新时间:2023-10-28 21:03:48 26 4
gpt4 key购买 nike

在 Java 6 中,以下代码按预期运行,但在 Java 8 中需要更多时间。有趣的部分是组件使用相同的方法 setEnable() 来启用和禁用组件,但是禁用调用比启用调用花费的时间要长得多,几乎是两倍。 Java 8 中的禁用比 Java 1.6 中的禁用时间长得多。问题是为什么会发生这种情况?这是 Java 8 的性能问题吗?

以下是 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

以下是 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

代码:

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();
}
});
}
}

最佳答案

根据我的分析器,操作大部分时间都花在方法Thread.holdsLock中,这确实是一个代价高昂的操作,由Component.checkTreeLock调用> 由 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() 之间的区别为后者是测量耗时的正确工具。

关于与 Java 6 相比,Java 8 较差的 GUI 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28046809/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com