java.awt.container.add(comp) 瓶颈

标签 java performance swing user-interface containers

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

图形部分运行速度惊人且速度很快,但在运行分析器 (YourKit) 后,96-99.8% 的时间都花在为节点创建摘要选项卡/表上。因此,对于 10,000 个节点,需要一两秒才能直观地生成图形,但需要几分钟才能填充表格!

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

群体是每行一个节点,每行三个单元格(JPanel)(每个单元格包含一些信息)。每次添加新行或要求该行检查更新时创建单元格时,它都会调用下面提供的“positionPanel”方法。布局管理器是SpringLayout。根据探查器,在生成此表的 90% 中,90% 减一是“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); 
}

最佳答案

考虑的建议JTable取决于它对 flyweight pattern 的使用实现rendering 。这样做的好处是仅渲染可见/更改的节点,而忽略其他节点。 JGraph 使用类似的方法。概述了基 native 制here 。请注意, yield 仅针对 View ,但您的分析表明这可能是值得的。

关于java.awt.container.add(comp) 瓶颈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11582748/

相关文章:

java.lang.ArithmeticException : Division is undefined 异常

java - 在 Java 中使用数组实现堆栈

algorithm - 获取二叉搜索树的间隔与排序数组一样快

java - 在生产环境中使用 HSQLDB 安全吗? (JBoss AS5.1)

java - 保护 Spring MVC 免受 XSS 攻击

java - Watson Natural Language Understanding Java 示例

Python日志记录导致延迟?

java - 制作一个不会中断整个程序的倒数计时器?

java - 无法解析类型 javax.swing.JComponent

Java swing - 尺寸错误