【问题标题】:java.awt.container.add(comp) bottleneckjava.awt.container.add(comp) 瓶颈
【发布时间】:2012-07-20 15:48:37
【问题描述】:

我正在更新/维护现有的绘图程序。这应该是一个中型程序(能够处理少于一百万个节点+它们的转换)。在 GUI 中,有一个“视口”可以直观地显示图形,还有一个侧面板,其中包含包含节点、转换等摘要的选项卡...

图形部分的效果非常好,速度很快,但在运行分析器 (YourKit) 后,96-99.8% 的时间都花在为节点创建摘要选项卡/表上。因此,对于 10,000 个节点,可视化生成图形需要一两秒,但填充表格需要几分钟!

该过程的摘要如下:选项卡收到模型更改的通知并获取节点列表。如果它需要更多行,它会添加它们,否则它会重用或丢弃旧的。然后在创建行及其单元格后,填充它们。

人口是每行一个节点,每行三个单元格(JPanel)(每个都包含一些信息)。每次在添加新行或要求该行检查更新时创建一个单元格时,它都会调用下面提供的“positionPanel”方法。布局管理器是 SpringLayout。根据分析器,在生成此表的百分之九十中,百分之九十减去一是“add(newPanel);”行。

关于速度的提高以及如何提高速度有什么建议吗?

private void positionPanel(int row, int col) {

      JPanel upPanel = this;
      JPanel leftPanel = this;
      String upSpring = SpringLayout.NORTH;
      String leftSpring = SpringLayout.WEST;
      if (row != 0) {
        upPanel = cells.get(row - 1)[col];
        upSpring = SpringLayout.SOUTH;
      }
      if (col != 0) {
        leftPanel = cells.get(row)[col-1];
        leftSpring = SpringLayout.EAST;
      }
      Cell newPanel = cells.get(row)[col];
      //cells.get(row).set(col, newPanel);
      add(newPanel);
      layout.putConstraint(SpringLayout.NORTH, newPanel, cellSpacing, upSpring, upPanel);
      layout.putConstraint(SpringLayout.WEST, newPanel, cellSpacing, leftSpring, leftPanel); 
}

【问题讨论】:

  • @Max 根据其文档,有问题的课程是在 2006 年 7 月 18 日制作的。他们有自己的理由制作自己的表格,我认为他们可以有复选框。我将运行基准测试,看看 JTable 将如何处理负载,可能会改变。
  • @jdmaguire:为方便起见,Boolean.class 的默认rendererJCheckBox

标签: java performance swing user-interface containers


【解决方案1】:

考虑JTable 的建议取决于它使用flyweight pattern 来实现rendering。好处来自仅渲染可见/更改的节点,而忽略其他节点。 JGraph 使用类似的方法。基本机制概述here。请注意,好处只对视图产生,但您的分析表明它可能是值得的。

【讨论】:

    猜你喜欢
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多