私はGWTを使用して、パフォーマンスが一般的に正しいHTMLアプリケーションを構築しています。
場合によっては、DOMに多くのオブジェクトをロードでき、アプリケーションの速度が低下することがあります。Chrome Developer Tools Profilerを使用して、その時間がどこで費やされたかを確認しました(アプリがコンパイルされると、Chromeで、つまりGWTオーバーヘッドはありません)、getAbsoluteLeft()/ getBoundingClientRect()メソッドがこの時間の大部分を消費することは明らかです。
Chrome(com.google.gwt.dom.client.DOMImplStandardBase)で使用される実装は次のとおりです。
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);
}
DOM内の要素が多いほど、絶対位置の計算に時間がかかる可能性があるため、これは私には理にかなっています。ただし、アプリケーションのサブパートだけが変更されていることがわかっている場合もありますが、これらのメソッドでは絶対位置の計算に時間がかかることがあります。これは、おそらくDOM要素全体を不必要に再チェックするためです。私の質問は、ブラウザ/ JavaScriptに関連する問題であるため、必ずしもGWT指向ではありません。
大規模なDOM要素アプリケーションのGWTgetAbsoluteLeft/ javascript getBoundingClientRect問題を改善するための既知の解決策はありますか?
インターネット上で手がかりは見つかりませんでしたが、次のような解決策について考えました。
- (これらのメソッドの呼び出し数を減らす:-)..。
- 絶対位置を取得するためにブラウザーが評価する必要のある要素の数を減らすために、iframeを介してDOMの一部を分離します(ただし、コンポーネントの通信が困難になります...)
- 同じ考えで、いくつかのcssプロパティ(オーバーフロー、位置?)またはいくつかのhtml要素(iframeなど)があり、ブラウザにdomの全体をスキップするように指示するか、単にブラウザが絶対位置をより速く取得するのを助けます
編集 :
Chrome TimeLineデバッガーを使用し、DOMに多くの要素があるときに特定のアクションを実行すると、平均的なパフォーマンスが得られます。
- スタイルの再計算:ほぼゼロ
- ペイント:ほぼ1ミリ秒
- レイアウト:約900ms
レイアウトには、getBoundingClientRectメソッドを介して900ミリ秒かかります。このページには、getBoundingClientRect ...を含む、WebKitでレイアウトをトリガーするすべてのメソッドが一覧表示されます。
domにはアクションの影響を受けない要素がたくさんあるので、レイアウトはDOM全体で再計算を行っていると思いますが、 paintはcssプロパティ/ DOMツリーを介してスコープを狭めることができます(firebugのMozAfterPaintEventで確認できます)例)。
レイアウトをトリガーするメソッドをグループ化して呼び出すことを除いて、レイアウトの時間を短縮する方法についての手がかりはありますか?
いくつかの関連記事: