我想使用JavaFX可视化一个静态图表,其中有10个系列,每个系列有10'000个点。在我的第一次测试之后,我有点担心JavaFX图表API的性能,尤其是构造函数new XYChart.Series<>(...)
,它需要3分钟的初始化时间来初始化100’000个数据点。
如果你不相信我,运行下面的代码:
public static final int SIZE = 100000;
public static void main(String[] args) {
List<XYChart.Data<Integer, Integer>> data = new ArrayList<>(SIZE);
measureTime("creating list", () -> {
for (int i=0; i<SIZE; i++) {
data.add(new XYChart.Data<>(i, i));
}
});
measureTime("creating series", () -> {
new XYChart.Series<>(FXCollections.observableList(data));
});
}
public static void measureTime(String msg, Runnable f) {
long start = System.nanoTime();
f.run();
long end = System.nanoTime();
System.err.println("Time for " + msg + ": " + (end - start) / 1000000 + " ms");
}
这些是我电脑上的结果:
Time for creating list: 62 ms
Time for creating series: 173555 ms
为什么初始化需要这么长时间?如何解决这个问题?
或者有没有一种方法可以在没有Observables的情况下使用JavaFX图表?
系列创建似乎是一个性能问题,在Java 8u25和Java 8u40之间得到了修复。
我在8u25上运行了您的应用程序,得到了以下结果:
Time for creating list: 59 ms
Time for creating series: 135896 ms
升级到8u40并再次运行,我得到了以下结果:
Time for creating list: 66 ms
Time for creating series: 80 ms
所以,只要更新到最新的Java版本,就可以开始了。