JavaAwtSwing笔记之 Label和JLabel性能对比, JLabel竟比Label快好多

186 阅读2分钟

性能对比 , JLabel竟然比Label快好多

加载9980个Label 用时 22079 毫秒

package labelJLabel;

import java.awt.*;
import java.awt.event.*;

public class 加载多个Label的用时 {
	
	public static void main(String...arguments) {
		long beginning = System.currentTimeMillis();
		Frame frame = new Frame("加载一万个Label的用时");
		frame.addWindowListener(new WindowAdapter() {@Override public void windowClosing(WindowEvent event) {frame.dispose();System.exit(0);}});
		frame.setBounds(100,50,1600,800);
		frame.setLayout(new FlowLayout());
		for(int c=0;c<9980;c++) {  // Win10下 9988 会报 Exception in thread "main" java.lang.InternalError: 当前程序已使用了 Window 管理器对象的系统允许的所有句柄。
			Label lb = new Label("Label-"+c); lb.setBackground(Color.PINK);
			frame.add(lb);
		}
		frame.setVisible(true);
		long cost = System.currentTimeMillis()-beginning;
		System.out.println("用时 "+cost+" 毫秒");
	}

}

在这里插入图片描述

加载9980个JLabel 才用时 695 毫秒

package labelJLabel;

import java.awt.*;
import java.awt.event.*;

import javax.swing.JLabel;

public class 加载多个JLabel的用时 {
	
	public static void main(String...arguments) {
		long beginning = System.currentTimeMillis();
		Frame frame = new Frame("加载一万个JLabel的用时");
		frame.addWindowListener(new WindowAdapter() {@Override public void windowClosing(WindowEvent event) {frame.dispose();System.exit(0);}});
		frame.setBounds(100,50,1600,800);
		frame.setLayout(new FlowLayout());
		for(int c=0;c<9980;c++) {  // Win10下 9988个Label 会报 Exception in thread "main" java.lang.InternalError: 当前程序已使用了 Window 管理器对象的系统允许的所有句柄。
			JLabel lb = new JLabel("JLabel-"+c); lb.setBackground(Color.PINK); lb.setOpaque(true);
			frame.add(lb);
		}
		frame.setVisible(true);
		long cost = System.currentTimeMillis()-beginning;
		System.out.println("用时 "+cost+" 毫秒");
	}

}

在这里插入图片描述

加载 5万个JLabel 用时 19394 毫秒 比9000个Label还快, 没有windows句柄限制

package labelJLabel;

import java.awt.*;
import java.awt.event.*;

import javax.swing.JLabel;

public class 加载多个JLabel的用时 {
	
	public static void main(String...arguments) {
		long beginning = System.currentTimeMillis();
		Frame frame = new Frame("加载一万个JLabel的用时");
		frame.addWindowListener(new WindowAdapter() {@Override public void windowClosing(WindowEvent event) {frame.dispose();System.exit(0);}});
		frame.setBounds(100,50,1600,800);
		frame.setLayout(new FlowLayout());
		for(int c=0;c<50000;c++) {  // Win10下 9988个Label 会报 Exception in thread "main" java.lang.InternalError: 当前程序已使用了 Window 管理器对象的系统允许的所有句柄。
			JLabel lb = new JLabel("JLabel-"+c); lb.setBackground(Color.PINK); lb.setOpaque(true);
			frame.add(lb);
		}
		frame.setVisible(true);
		long cost = System.currentTimeMillis()-beginning;
		System.out.println("用时 "+cost+" 毫秒");
	}

}