Javascript 适用于大型应用的回流/布局性能
我正在使用GWT构建一个HTML应用程序,其性能通常是正确的 有时,它会在DOM中加载许多对象,应用程序会变得很慢。我使用Chrome Developer Tools Profiler查看这段时间花在哪里(编译应用程序后,在Chrome下,即没有GWT开销),很明显,方法getAbsoluteLeft()/getBoundingClientRect()占用了这段时间的大部分时间 以下是在Chrome(com.google.gwt.dom.client.dominmplstandardbase)下使用的实现: 这对我来说很有意义,因为DOM中的元素越多,计算绝对位置所需的时间就越长。但这是令人沮丧的,因为有时您知道应用程序的一个子部分已经更改,而这些方法仍然需要时间来计算绝对定位,可能是因为它不必要地重新检查了一大堆DOM元素。我的问题不一定是面向GWT的,因为这是一个与浏览器/javascript相关的问题: 对于大型DOM元素应用程序,是否有任何已知的解决方案可以改进GWT getAbsoluteLeft/javascript getBoundingClientRect问题 我在互联网上没有找到任何线索,但我想到了如下解决方案:Javascript 适用于大型应用的回流/布局性能,javascript,html,gwt,dom,Javascript,Html,Gwt,Dom,我正在使用GWT构建一个HTML应用程序,其性能通常是正确的 有时,它会在DOM中加载许多对象,应用程序会变得很慢。我使用Chrome Developer Tools Profiler查看这段时间花在哪里(编译应用程序后,在Chrome下,即没有GWT开销),很明显,方法getAbsoluteLeft()/getBoundingClientRect()占用了这段时间的大部分时间 以下是在Chrome(com.google.gwt.dom.client.dominmplstandardbase)下
- (减少对这些方法的调用次数:-)
- 通过iframe隔离部分DOM,以减少浏览器为获得绝对位置而必须计算的元素数(尽管这会使组件难以通信…)
- 同样,可能存在一些css属性(溢出、位置?)或一些html元素(如iframe),它们告诉浏览器跳过dom的整个部分,或者只是帮助浏览器更快地获得绝对位置
- 重新计算样式:几乎为零
- 油漆:接近1毫秒
- 布局:近900毫秒
private static native ClientRect getBoundingClientRect(Element element) /*-{
return element.getBoundingClientRect && element.getBoundingClientRect();
}-*/;
@Override
public int getAbsoluteLeft(Element elem) {
ClientRect rect = getBoundingClientRect(elem);
return rect != null ? rect.getLeft()
+ elem.getOwnerDocument().getBody().getScrollLeft()
: getAbsoluteLeftUsingOffsets(elem);
}