【发布时间】:2017-03-19 09:07:36
【问题描述】:
我正在尝试使用JScrollPane 创建一些数据的缩略图图表,但遇到了性能问题。这个例子有大约 100 个缩略图,每个有 5000 个样本。当我尝试多次向下和向上滚动时,滚动会出现延迟,CPU 负载增加,应用程序内存使用量达到 500 Mb 以上。
有没有办法在不减少数据的情况下避免这个性能问题?
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.ThermometerPlot;
import org.jfree.data.general.DefaultValueDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
public class ThumbnailChartsTest extends JPanel {
private static final int W = 200;
private static final int H = W;
private static final int N = 5000;
private static final Random random = new Random();
private static ChartPanel createPane() {
final XYSeries series = new XYSeries("Data");
for (int i = 0; i < random.nextInt(N) + N; i++) {
series.add(i, random.nextGaussian());
}
XYSeriesCollection dataset = new XYSeriesCollection(series);
JFreeChart chart = ChartFactory.createXYLineChart("Random", "Domain",
"Range", dataset, PlotOrientation.VERTICAL, false, false, false);
return new ChartPanel(chart, W, H, W, H, W, H,
false, true, true, true, true, true);
}
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(0, 4));
for (int i=0; i<100; i++){
panel.add(createPane());
}
JScrollPane scrollPane = new JScrollPane(panel,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
f.add(scrollPane);
f.pack();
f.setVisible(true);
}
});
}
}
编辑:我无法理解一件事:为什么在这种情况下内存使用量仍然很大!请看这个插图。
补充: 我觉得有些误会。
通过监视器 visualVM 的堆大小 启动后的小程序堆大小只有 125 Mb,很酷。 但后来我开始测试:滚动和调整大小多次,越来越多 - 上下,上下,更小的框架和更大的框架。堆大小超过 500 Mb!我想这种情况是不正常的。
补充 #2
现实世界的例子:
我的数据大小只有 2 Mb,用 90 个图表表示(每个图表 2 个系列),一个系列包含 3000 个元素。我已经实现了通过滑块更改数字列。
但是对于这个超过 1.5 GB 的小数据堆大小!
这发生在某些操作之后,例如更改数字列 对于我的 CPU(core 2 duo 2.2GHz),每个绘图表大约需要 4 秒!有了这么大的延迟,很难控制滑块。
更新:
我已将数据下采样到每个缩略图图表 100 个样本。 现在它肯定更快,但仍然存在巨大堆大小的问题。图片上是700Mb以上,不是记录。我很沮丧。
【问题讨论】:
标签: java swing thumbnails jscrollpane jfreechart