1

我正在尝试同时绘制一些图表:每个图表代表一个属性并显示几个对象的结果,每个对象都包含自己的数据项系列。使用 TimeSeries 的 add(...) 或 addOrUpdate(...) 方法时,我遇到了非常糟糕的性能 - 绘制约 16,000 个项目的时间约为 60 秒。我阅读了有关性能问题的信息 - http://www.jfree.org/phpBB2/viewtopic.php?t=12130&start=0 - 但在我看来,出于某种原因,我的情况要糟糕得多。

  1. 我想了解这是否真的是我可能从模块中挤出的性能(运行 Windows 的 2.5GHz 机器 - 我对此表示怀疑)。
  2. 我怎样才能在这方面加速我的应用程序?

这是代码的基本版本(请注意,它都是在专用线程中完成的):

/* attribute -> (Object -> graph values) */
protected HashMap<String,HashMap<Object,Vector<TimeSeriesDataItem>>> m_data = 
  new HashMap<String,HashMap<Object,Vector<TimeSeriesDataItem>>>();

public void loadGraph() {
    int items = 0;
    for (String attr : m_data.keySet()) 
        for (Object obj : m_data.get(attr).keySet())
            for (TimeSeriesDataItem dataItem : m_data.get(attr).get(obj))
                items++;
    long before = System.currentTimeMillis();

    // plot each graph
    for (String attr : m_data.keySet()) {  
        GraphXYPlot plot = m_plots.get(attr);
        plot.addToObservation(m_data.get(attr));
    }

    System.err.printf("Time for plotting %d items is:  %d ms", items, System.currentTimeMillis()-before);
    // => Time for plotting 16540 items is:  59910 ms
}

public void addToObservation(HashMap<Object, Vector<TimeSeriesDataItem>> plotData) {
    for (Object obj : plotData.keySet()) {
        SeriesHandler handler = m_series.get(obj);
        if (handler != null) {
            TimeSeries fullSeries = handler.getFullSeries();
            TimeSeries periodSeries = handler.getPeriodseries();
            for (TimeSeriesDataItem dataItem : plotData.get(obj)) {
                fullSeries.add(dataItem);
                periodSeries.add(dataItem);
            }
        }
    }
}

非常感谢 !

盖伊

4

1 回答 1

1

如果没有更多细节,则应考虑几种一般优化中的任何一种:

  • 按照这里setNotify(false)的建议调用。

  • 缓存已计算的值,如此所述。

  • 采用分页策略,如此处所示

  • 绘制价值摘要图表average/time-unit;根据 a 中ChartEntity看到的ChartMouseListener,在相邻面板中显示扩展的子集。

于 2012-12-20T18:05:47.380 回答