Java6是否真的快了?

转载自 http://blog.sina.com.cn/swingjava

现在Java6已经发布了,除了许多令人激动的新功能以外,最让Java用户激动也许就是Java6的速度比Java5有了进一步的提高。包括JVM、Java Swing在内的许多部分都有不同程度的提高,总的来说Java6平均比Java5提高了20%-30%。Java2D在Java6中做了特殊的优化,其速度提高更大。

但是最近有人报告JFreeChart在Java 6要比Java 5上要慢,Dave Gilbert觉得很可疑,于是他亲自使用JFreeChart做了Java5和Java6性能测试,并在他的博客公布了测试结果,下面是Dave博客的原文译文。

我收到一个报告说JFreeChat在Java6下比在Java5下跑的要慢,我觉得很奇怪,因为我平时的观察是Java6要比Java5要明显快,各方面都是如此。于是,我花了些时间做了一个benchmark,测试一些标准类型图表(饼图、直方图以及时间序列图),自己亲自看看。

每一种图表类型,我写了一个方法创建一个新的图表,然后生成一个BufferedImage(500x300),然后将它画到图像中。为测试性能,我调用该方法1000次,分别记录第一个500次和第二个500次重复生成图表的时间,结果是第二个500次总是比第一个500次速度要快,可以想象这是 HotSpot起作用的结果...但是Java 5和Java 6之间变化总是相同的,因此这儿我只贴出了第一个500次的测试结果。每个时间记录我都运行了三边,并取平均值作为测量结果(每次运行结果基本相当)。

首先,在WindowsXP上测量的结果(因为测量的是相同重复次数所用时间,因此值越小越好):

和WindowsXP同一台机器运行的Ubuntu Linux上结果相似(总的来说比WindowsXP慢一些):

这给我留下了深刻的印象,所有在Java6的测试用例,500张图在10秒中之内生成,大概每秒钟生成50到70张!Java5和Java6之间的性能改进让人震惊!

生成图表的源代码(生成直方图):
public void run() {
    DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    dataset.addValue(3.5, "Row 1", "Column 1");
    dataset.addValue(4.5, "Row 2", "Column 1");
    dataset.addValue(2.5, "Row 1", "Column 2");
    dataset.addValue(6.5, "Row 2", "Column 2");
    dataset.addValue(5.5, "Row 1", "Column 3");
    dataset.addValue(4.5, "Row 2", "Column 3");
    dataset.addValue(8.5, "Row 1", "Column 4");
    dataset.addValue(5.5, "Row 2", "Column 4");
    JFreeChart chart = ChartFactory.createBarChart("Test Chart",
            "Category", "Value", dataset, PlotOrientation.VERTICAL, true,
            true, false);
    BufferedImage image = new BufferedImage(500, 300,
            BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2 = image.createGraphics();
    chart.draw(g2, new Rectangle(500, 300));
}

饼图的源代码:
public void run() {
    DefaultPieDataset dataset = new DefaultPieDataset();
    dataset.setValue("Section 1", 43.4);
    dataset.setValue("Section 2", 13.8);
    dataset.setValue("Section 3", 27.9);
    dataset.setValue("Section 4", 3.4);
    dataset.setValue("Section 5", 29.9);
    dataset.setValue("Section 6", 75.3);
    JFreeChart chart = ChartFactory.createPieChart("Test Chart", dataset,
            true, true, false);
    BufferedImage image = new BufferedImage(500, 300,
            BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2 = image.createGraphics();
    chart.draw(g2, new Rectangle(500, 300));
}

时间序列图源代码:
public void run() {
    TimeSeries s = new TimeSeries("Series 1");
    Day t = new Day();
    for (int i = 0; i < 100; i++) {
        s.add(t, 100.0);
        t = (Day) t.next();
    }
    TimeSeriesCollection dataset = new TimeSeriesCollection();
    dataset.addSeries(s);
  
    JFreeChart chart = ChartFactory.createTimeSeriesChart("Test Chart",
            "Date", "Value", dataset, true, true, false);
    BufferedImage image = new BufferedImage(500, 300,
            BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2 = image.createGraphics();
    chart.draw(g2, new Rectangle(500, 300));
}

我也曾使用GNU Classpath(JamVM)运行过这些测试,结果是,饼图耗时264,733 milliseconds, 直方图263,238 milliseconds, 时间序列图470,054 milliseconds. 这比我预期的要慢一些,大概一秒钟生成1-2个图,并且我相信屏幕刷新(例如,当运行JFreeChart演示时)速度要快一些。这也许和BufferedImage有关...不幸运的是目前我还没有时间仔细研究。

单从作者做的这次性能测试来看,GNU Classpath的运行结果竟然要比Java6慢20-30倍!Java6能在一秒钟内生成50-70幅图表,而GNU Classpath一秒钟内才能生成1-2幅,不知道IBM的Java速度又会怎么样。
文章引用自:http://jroller.com/page/dgilbert?entry=is_java_se_1_6

你可能感兴趣的:(java,linux,swing,ubuntu,jfreechart)