【问题标题】:Does GWT's UiBinder really improves app performance?GWT 的 UiBinder 真的能提升应用性能吗?
【发布时间】:2012-10-17 09:25:50
【问题描述】:

两年前我读过一个关于 UiBinder 性能的答案https://stackoverflow.com/a/3755675/1067931 并决定对其进行测试。

我构建了一个非常复杂的布局,其中包含许多按钮和一个内嵌的面板。 第 1 版 的布局纯粹是在 UiBinder xml 中构建的,而 第 2 版 纯粹是通过编程构建的。

我将这两个版本都部署到 App Engine 并运行这两个版本,同时在每次运行前清除浏览器缓存。 Version 1 (UiBinder) 在 ~12 秒 后加载,而 Version 2~3 秒 后加载,所以真的不鼓励我使用 UiBinder。你有不同的印象吗?

【问题讨论】:

  • 测量某物时,请始终明确定义您要测量的内容。 UI 渲染速度与浏览器缓存或应用部署位置有何关系? 如果取决于这些因素,那么性能瓶颈可能不是 UI 渲染或 DOM 操作(例如,可能在 UiBinder 变体中)您正在使用不同的方法来加载图像?)

标签: gwt


【解决方案1】:

UiBinder 就像任何 GWT 生成器一样,生成 Java 代码。因此,首先,阅读生成的内容并将其与您手动编写的内容进行比较(将 -gen 选项传递给 GWT 编译器或 DevMode 以使其将生成的代码写入磁盘)。

UiBinder 的亮点在于 HTMLPanel 和 I18N,因为它使代码比用 Java 编写的代码更具可读性。

GWT 2.5 还引入了 IsRenderableRenderablePanel 作为实验性功能,但可以在某些条件下提高您的性能(它们是为了提高 Orkut 的性能)。同样,UiBinder 使其易于使用(IsRenderable 否则需要以适当的顺序并在适当的时间调用其方法以获得最佳性能;UiBinder 使这一点变得透明)。不幸的是,除了RenderablePanel 之外没有其他IsRenderable 小部件,因此只有创建自己的实现IsRenderable 的小部件才有帮助;而IsRenderable 的运行水平很低。

一般来说,UiBinder 的执行速度不应该比手写代码慢(当然对于小部件的等效排列)。当人们说 UiBinder 表现更好(在IsRenderable 之外)时,它鼓励您使用HTMLPanel 而不是面板进行布局。例如,包含 HTML <table> 或一组 <div>s 的 HTMLPanelFlexTable 或一堆 FlowPanels 执行得更快(假设您不需要动态修改布局)。

【讨论】:

    【解决方案2】:

    在我看来直觉上是正确的,UiBinder-Code 会导致更长的启动时间。原因如下:

    假设您尝试在视图中定义 20 个按钮。在您的声明式布局中,您将显式声明每个按钮,而在您的命令式布局中,您很可能会使用 for 循环。这似乎会导致命令式布局的 JS 尺寸更小。

    还要考虑到,在实际应用中,这种差异可能可以忽略不计,因为视图通常是项目的最小部分。

    documentation of UiBinder 似乎暗示,它更多的是关于运行时性能,所以如果你对减少加载时间感兴趣,我建议你看看
    Code Splitting,
    HTML5 Appcache
    and general performance tips(虽然有点过时,但还是很有用的!)

    感谢您的提问,我为 GWT 功能(如 UiBinder)搜索了一个广泛的性能测试套件,但结果为空。

    【讨论】:

    • 你是对的。当我不使用 for 循环构建命令式布局时,它加载缓慢。 UiBinder 和 Imperative 完全同时加载。
    • 哇,我觉得避免 UI Binder 是正确的。 XML 编码让我非常恼火,我写了一个 bean builder 生成实用程序:b-generation.freshcode.biz。所以现在我使用类似于 html 的巨大方法链。
    猜你喜欢
    • 2011-10-02
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多