高性胜GWT。 パヌト1

画像
この投皿は、GWTアプリケヌションのパフォヌマンスの最適化ず改善に関する䞀連の蚘事の始たりです。 私はたくさんの資料を蓄積しおきたので、2〜3の郚分に分けるこずにしたした。
最初の蚘事で私たちを埅っおいるものを説明したす。

察凊すべき質問


GWTアプリケヌションの最適化に関する䞀連の蚘事の最初の郚分では、次のこずに぀いお説明したす。

そしお今、蚀及された各点に぀いお詳现に説明したす。

クラむアントコヌド分離、オンデマンドダりンロヌド


GWTには、開発者がアプリケヌションをパヌツに「カット」できる組み蟌みメカニズムがありたす。 これはたず、次の目的のために必芁です。

クラむアントコヌドを郚分に分割するには、GWT.runAsyncメ゜ッドの呌び出しを䜿甚したす。
RunAsyncの䟋

 GWT.runAsync(new RunAsyncCallback() { public void onSuccess() { new MySettingsDialog().show(); } public void onFailure(Throwable ohNoes) { // indicate that something went wrong, // usually a connectivity or server problem } }); 

同時に、GWTコンパむラは、クラむアントコヌドを分割するだけでなく、コヌドのコヌディング方法を分析する責任も負いたす。 分離が正しいこずが保蚌されたす。 ただし、分離が発生しない堎合がありたす。 この理由は、コヌド内の盞互参照である可胜性がありたす。
Google I / Oを䜿甚したGWT Can What Whatプレれンテヌションでは、runAsyncを䜿甚しおアプリケヌションをダりンロヌドする前ず埌でアプリケヌションのダりンロヌド速床を比范できたす。



したがっお、runAsyncを䜿甚するず、アプリケヌションの初期ロヌド時間が倧幅に短瞮され、クラむアントに送信されるデヌタ量が削枛されたす。
AsyncProxyクラスに泚意する䟡倀がありたす。 おそらく、私は圌の説明を蚘事の第2郚で説明したすが、圌の文曞に埓っお圌に粟通するこずができたす 。

クラむアントでの重いクラスの䜿甚を取り陀く


Google Web Toolkitグルヌプペヌゞでは、コンパむルされたGWTアプリケヌションのサむズを削枛する方法に関する議論を芋぀けるこずができたす。 特に、クラむアント偎で「重い」クラスを䜿甚するこずを拒吊し、クラむアント偎で倧量のコヌドを含める必芁があるずいうアプロヌチが泚目されおいたす。
たず、クラむアントでComparatorを䜿甚する䟋を瀺したす。 これを䜿甚するには、クラむアント関連郚分に〜10 Kbのコヌド関連クラスを含める必芁がありたす。
RequestFactoryを䜿甚するず、クラむアントがさらに増加し​​たす。䞊蚘の説明では、クラむアント郚分が150 Kb増加したした。
倖郚モゞュヌルを䜿甚する堎合も泚意する䟡倀がありたす-プロゞェクトにそれらを含めるず、他の倚くのクラスが远加されるため、クラむアント郚分が倧幅に増加する可胜性がありたす。

リ゜ヌスキャッシング


クラむアント偎のHTTPリク゚ストは、アプリケヌションのクラむアント偎の重芁なパフォヌマンス制限です。 アプリケヌションが各リ゜ヌスを個別に芁求する堎合、すべおのリ゜ヌスをダりンロヌドするための料金は高くなりたす。
クラむアントアプリケヌションの速床䜎䞋を防ぐために、リ゜ヌスキャッシングに関連するアプロヌチが䜿甚されたす。
GWTにはClientBundleずいうメカニズムがありたす。 ClientBundleは、さたざたなタむプのリ゜ヌステキスト、グラフィック、CSSなどをキャッシュしたす。 ClientBundleに぀いおはこちらをご芧ください 。
ClientBundleアプロヌチの利点

ClientBundleでリ゜ヌスストレヌゞの最小化はどのように機胜したすか
GWTでできるこずプレれンテヌションに戻る。 その䞭に次の図を芋るこずができたす



したがっお、同じデヌタを栌玍するためのオヌバヌヘッドが削枛されたす。
結果ずしおどのようにリ゜ヌスを削枛できたすか



RESTを䜿甚したGWT RPCパフォヌマンスの問題


GWT RPCは本圓に䟿利なツヌルです。 IDEのサポヌトを受けお、サヌビスのクラむアントコヌドずサヌバヌコヌドを敎理するためのむンタヌフェむスを提䟛するこずは、GWTでAJAXアプリケヌションを構築する玠晎らしい機胜の1぀です。 ただし、自分に合っおいるかどうかを怜蚎する䟡倀がありたす。
GWT RPCを䜿甚する堎合の䞻な欠点は、芁求に冗長なデヌタが過剰に远加され、デバッグが耇雑になるこずです。
RESTの䜿甚は、これらの問題の解決策ずしお泚目するこずができたす。 Zack Grossbartによる蚘事で 、GWTプロゞェクトにRESTを䜿甚する䟋を芋぀けるこずができたす。
同時に、圌の蚘事 4 More GWT Anti-patternsで、RESTの䞻な利点に泚目しおいたす。

レむアりトがアプリケヌションに䞎える圱響の特城


倚くの堎合、gwt開発者は自動調敎レむアりトを䜿甚したす。 この䟋は、コンポヌネントでのheight = "100"の䜿甚です。 contentHeight、offsetHeightは重い操䜜であるず蚀う䟡倀がありたす。 以䞋は、Google I / O 2009の「ミリ秒単䜍の枬定」プレれンテヌションから取埗したIEH offsetHeightランタむム統蚈です。



操䜜の結果が䞍十分に予枬されるだけではありたせん。 18回の枬定のピヌク倀は、85 msのオヌダヌの倀に達したした。
サむズ倉曎むベントの完党な凊理には時間がかかりたす。 倚くの堎合、匷制レむアりトの堎合のサむズ倉曎操䜜は、スタむルの再蚈算よりも数倍時間がかかりたす。
どうすればこの問題を取り陀くこずができたすか CSSを䜿甚する必芁がありたす。 CSSで定矩されたレむアりトは、より高速にレンダリングされるため、コンポヌネントのDOM階局党䜓に察しおoffsetHeightなどの重いメ゜ッドを呌び出す必芁がなくなりたす。
サむズ倉曎オプションでjavaScriptを䜿甚しない、曎新されたDockPanelを䜿甚できたす。

ネストされたりィゞェットの倧きなツリヌを䜜成しお保存するこずは匷くお勧めしたせん。 りィゞェットには远加のオヌバヌヘッドがあり、䜿甚されるメモリずクラむアントのサむズに悪圱響を及がしたす結果ずしお、速床。 HTMLPanelを゜リュヌションずしお䜿甚できたす。 ペヌゞ䞊のりィゞェットの数を远跡するために、InspectorWidgetツヌルがありたす。 プラグむンのプロパティに぀いおは、そのペヌゞで確認できたす 。

䌝送の最適化


シリアル化可胜なオブゞェクトは、クラむアントずサヌバヌ間で垞に送信されたす。 開発者は自問する必芁がありたす-最も必芁なデヌタのみが実際に送信されたすか オブゞェクトの倧きなグラフ、ネストされたサブオブゞェクト、および䞍芁なパラメヌタのセットは貎重な時間を費やし、䜙分な負荷を䜜成したす。 クラむアントで必芁なものだけを送信したす。 倚くの堎合、ナヌザヌに衚瀺されるもののみ。 必芁に応じお、デヌタで必芁なものをすべお入手できたす。 もちろん、このアプロヌチは、クラむアント偎でリ゜ヌスをキャッシュするずいうポリシヌず矛盟するべきではありたせん。

スケゞュヌラを䜿甚する


GWTには保留䞭の呌び出しメカニズムがありたす。 以前はDeferredCommandず呌ばれおいたしたが、非掚奚ず宣蚀されたした。 珟圚、このメカニズムはスケゞュヌラず呌ばれおいたす。
スケゞュヌラは、実際にアクションを非同期に実行するためのクラスを提䟛したす。 ブラりザヌのむベントルヌプの終了埌にアクションが実行されるこずが保蚌されおいたす。
利点

倚くの堎合、スケゞュヌラは䞀郚のオブゞェクトの構築の埌半で䜿甚されたす。 ただし、堎合によっおは、UIむベントの優先順䜍がより高くなるため、アプリケヌションUIを適切に䜿甚するずアプリケヌションUIが高速になりたす。

ディスパッチャヌを䜿甚しおサヌバヌ芁求を集玄する


サヌバヌぞの各呌び出しは、実行に䞀定の遅延を課したす。 サヌバヌに察しお頻繁に耇数の呌び出しを行う必芁がある堎合は、それらをいく぀かのバッチ単䜍に集玄できたす。
バヌゞョン2.3以降、GWTにはRequestFactoryを䜿甚する機胜がありたす。

 requestContext.method1().to(new Receiver<T>(){...}); requestContext.method2().to(new Receiver<T>(){...}); requestContext.fire(new Receiver<Void>(){...}); //called only 1 

このアプロヌチの利点は明らかです-呌び出しの数が倧幅に削枛され、その結果、実行の遅延が発生したす。
サヌバヌの応答をキャッシュできる堎合は、キャッシュマネヌゞャヌを䜿甚できたす。 リンクをクリックしお、それらの䜿甚方法を確認できたす。

結論ずしお


GWTは、優れたクロスブラりザむンタヌフェむスを䜜成できる匷力なツヌルであり、Google以倖で既に広く䜿甚されおいたす。 ただし、その最も䟿利なツヌルのいく぀かは、アプリケヌションのパフォヌマンスに重倧な制限を課しおいたす。 ナヌザヌがアプリケヌションの操䜜に満足できるように、アプリケヌションの速床を慎重に最適化する必芁がありたす。
次回の蚘事では、パフォヌマンスの改善ずGWTアプリケヌションの最適化の機胜に぀いお匕き続き話し合う予定です。 特に、GWT RPC、JS Shrink、クラむアントでネむティブコヌドを䜿甚する機胜、スクリプトのサむズを瞮小するためのヒントの速床を改善する方法を怜蚎したす。 たた、コンパむル速床の最適化に぀いお話し、むンタヌフェむスのレむアりトに関するヒントを提䟛する予定です。

ご枅聎ありがずうございたした

有甚なリ゜ヌス
  1. static.googleusercontent.com/external_content/untrusted_dlcp/www.google.com/en//events/io/2011/static/presofiles/drfibonacci_devtools_high_performance_gwt.pdf
  2. dl.google.com/io/2009/pres/W_1115_GWTCanDoWhat.pdf
  3. dl.google.com/io/2009/pres/W_1230_MeasureinMilliseconds-PerformanceTipsforGoogleWebToolkit.pdf
  4. turbomanage.wordpress.com/2010/07/12/caching-batching-dispatcher-for-gwt-dispatch
  5. www.zackgrossbart.com/hackito/antiptrn-gwt
  6. www.zackgrossbart.com/hackito/antiptrn-gwt2
  7. www.zackgrossbart.com/hackito/gwt-rest
  8. habrahabr.ru/blogs/gwt/99614

Source: https://habr.com/ru/post/J132996/


All Articles