加载大型表时的性能问题(SWT/JFace)



我有一个JFace TableViewer(大约有1k行),它是通过以下方式创建的:

TableViewer tableViewer = new TableViewer(composite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI | SWT.VIRTUAL);

我已经设置了内容和标签提供程序:

tableViewer.setContentProvider(new SampleTableContentProvider());
tableViewer.setLabelProvider(new SampleTableLabelProvider());
tableViewer.setInput(inputObject);
tableViewer.setComparator(sorter);

我还通过覆盖getImage(Object element,int colNumber)方法将图像设置为两列。

加载表需要花费大量时间。如何提高性能?

(请注意,这可能不一定能回答问题,但注释字段没有格式和足够的空间。

虽然SWT Table和JFace TableViewer并不以其性能而闻名,但显示1000个元素应该不会造成性能上的打击。

下面的代码片段创建了一个包含 5000 个元素的(甚至不是虚拟的)TableViewer,并且不需要花费明显的时间来呈现:

public class TableViewerPerformance {
  public static void main( String[] args ) {
    Display display = new Display();
    Shell shell = new Shell( display );
    shell.setLayout( new FillLayout() );
    TableViewer tableViewer = new TableViewer( shell, SWT.NONE );
    tableViewer.setLabelProvider( new LabelProvider() );
    tableViewer.setContentProvider( ArrayContentProvider.getInstance() );
    tableViewer.setInput( createModel() );
    shell.open();
    while( !shell.isDisposed() ) {
      if( !display.readAndDispatch() )
        display.sleep();
    }
    display.dispose();
  }
  private static Collection<Object> createModel() {
    Collection<Object> elements = new ArrayList<Object>();
    for( int i = 0; i < 5000; i++ ) {
      elements.add( new Object() );
    }
    return elements;
  }
}

如果您使用类似上述内容作为基础,则可以逐渐从应用程序代码中添加功能,并查看性能何时下降。

此外,以下是一些需要注意的常见事项,以提高 TableViewer 的性能

  • 尝试使用哈希查找。 在设置查看器输入之前必须调用TableViewer#setUseHashlookup( true )

  • 尝试使您的桌子是虚拟的。虚拟表仅在TableItem可见时创建它们。因此,当最初显示表时,创建了 20 个左右的 TableItems(与您实际看到的数量一样多),而不是 1000 个。排序不受影响,您可以使用没有 VIRTUAL 标志的TableViewer#setComparator()

  • 尝试将ILazyContentProviderVIRTUAL结合使用。这需要自己对元素进行排序。这意味着,您需要在内容提供程序返回模型元素之前对模型元素进行排序,而不是在 TableViewer 上设置比较器。

  • 如果您还没有这样做,请尝试缓冲图像,而不是在每次ILabelProvider#getImage()调用时重新创建它们

  • 如果是您的模型需要时间来加载,请尝试在后台线程中运行此操作。因此,UI 线程不会被阻止,应用程序保持响应。

最终,我建议使用探查器,而不是猜测代码的哪一部分导致了性能不佳。

最新更新