Swing


天行健 君子以自强不息

posts - 69, comments - 215, trackbacks - 0, articles - 16
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

nativeFont和logicalFont在JDK1.4下的重大效率差异

Posted on 2010-08-02 21:32 zht 阅读(365) 评论(0)  编辑  收藏 所属分类: J2SE

最近遇到一个很奇怪的问题,写了一个界面程序,刚开始没有 设置字体,效率还可以,但是默认字体看着比较难看,就改用了一个字体,谁知道在jdk1.4批量测试过程中,效率居然比原来要低非常非常的多。
后来发现如果是jdk1.5及以上版本两者效率几乎一样,见附件截图。
而且就Swing效率和增强功能来讲,JDK1.6u10及以上版本有非常大的提高,
所以如果条件运行,还是建议都改成JDK1.6u10及以上版本

测试代码如下:


public class FontDemo extends JPanel {

    
public static void main(String[] args) {
        JFrame f 
= new JFrame();
        f.setTitle(
"TWaver中文社区");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setContentPane(
new FontDemo());
        f.setSize(
800600);
        f.setLocationRelativeTo(
null);
        f.setVisible(
true);
    }


    
private TDataBox box = new TDataBox();
    
private BarChart chart = new BarChart(box);

    
private static final int times = 1000;
    
private static final int style = Font.BOLD;
    
private static final int size = 16;

    
public FontDemo() {
        initBox();
        initChart();
        initGUI();
    }


    
private void initGUI() {
        
this.setLayout(new BorderLayout());

        JScrollPane pane 
= new JScrollPane(chart.getLegendPane());

        
this.add(chart, BorderLayout.CENTER);
        
this.add(pane, BorderLayout.EAST);
    }


    
private void initBox() {
        
final List localFonts = new ArrayList();
        List nativeFonts 
= new ArrayList();

        
// get all available fontFamily names
        Font[] fonts = SunGraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
        
for (int i = 0; i < fonts.length; i++{
            
// separate logical and native font
            if (SunGraphicsEnvironment.isLogicalFont(fonts[i])) {
                localFonts.add(fonts[i]);
            }

            
else {
                nativeFonts.add(fonts[i]);
            }

        }


        System.out.println(
"///////////// localFonts test /////////////");
        
for (int i = 0; i < localFonts.size(); i++{
            Font font 
= (Font) localFonts.get(i);
            
long start = System.currentTimeMillis();
            
for (int k = 0; k < times; k++{
                createFont(font);
            }

            
long spendTime = System.currentTimeMillis() - start;
            Node n 
= new Node();
            n.setName(font.getName());
            n.putChartValue(spendTime);
            n.putChartColor(Color.GREEN);
            box.addElement(n);
            
//            System.out.println(">" + spendTime + "\t" + font.getName());
        }

        System.out.println(
"\n///////////// nativeFonts test /////////////");
        
for (int i = 0; i < nativeFonts.size(); i++{
            Font font 
= (Font) nativeFonts.get(i);
            
long start = System.currentTimeMillis();
            
for (int k = 0; k < times; k++{
                createFont(font);
            }

            
long spendTime = System.currentTimeMillis() - start;
            Node n 
= new Node();
            n.setName(font.getName());
            n.putChartValue(spendTime);
            n.putChartColor(Color.RED);
            box.addElement(n);
            
//            System.out.println(">" + spendTime + "\t" + font.getName());
        }

        System.out.println(
"\n$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
    }


    
private void createFont(Font font) {
        
//     font.deriveFont(style, size);
        new Font(font.getName(), style, size);
    }


    
private void initChart() {
        chart.setLegendLayout(TWaverConst.LEGEND_LAYOUT_VERTICAL);
        chart.setLegendOrientation(TWaverConst.LABEL_ORIENTATION_HORIZONTAL);
        chart.setYScaleTextVisible(
true);
        chart.setShadowOffset(
1);
    }

}



1.4测试结果


1.6测试结果



原帖地址