Rails/Ajax高速化関係メモ
RubyKaigiでも発表させてもらったのですが、Rubricks0.6リリースに向けてパフォーマンスをがんばって上げております。
以下、つらつらと。
render_componentが遅い
- render_componentはrequest.dupしてコントローラに投げなおすようなつくりになってて無駄が多い。
- シンプルなsimple_render_componentを自作して解決。
→コントローラの処理時間がに5倍近く高速化
毎回JSライブラリを読み直しは重い
- 数百kbyteのJSライブラリを読み直すのに時間がかかっている。
- ほとんどのJSをログイン時に先読みし、画面更新を全てAjaxベースで実施するように改良。
- ※ハッシュを駆使して戻るボタンはきくようにした。
→約2倍の高速化(evalScriptsが少ないページ)
IEでevalScripts:trueのAjaxが重い
- 上記対処をしたところ、先読み化しきれないJSが多く含まれるページが元よりも重くなった。(IEのみ)
- Ajaxを用いてscriptを評価するにはevalを用いるため、IEのevalが遅いのが原因。
- 普通にJSを読み込む場合の倍近く時間がかかる。
- 基本的には対処できないが、空白や改行などをカットしてeval対象文字列を小さくして緩和。
→2倍程度の高速化(evalScriptsが多いページ)
IEを長時間使っていると重くなってくる
- よく話題になるメモリリークが原因。
- 擬似画面遷移時にprototype.jsのEvent.unloadCache();を呼んで解放することで大抵は解決。
- (その際にDraggables.drags = [];をしないとDnDが一切効かなくなる)
- 普通に画面遷移するアプリなら画面遷移時に自動でunloadされるので意識する必要はない。
- ただし、2007/6/15のWindowsUpdateに含まれていたパッチでリーク自体ほとんどしなくなった。
(Shouta)