Rails/Ajax高速化関係メモ

RubyKaigiでも発表させてもらったのですが、Rubricks0.6リリースに向けてパフォーマンスをがんばって上げております。
以下、つらつらと。

render_componentが遅い

  • render_componentはrequest.dupしてコントローラに投げなおすようなつくりになってて無駄が多い。
  • シンプルなsimple_render_componentを自作して解決。

→コントローラの処理時間がに5倍近く高速化

IEはDOM操作を行うと重い

  • 一般的にDOM操作よりもinnerHTMLの方が速い。
  • SpinelzをDOM操作ではなく極力innerHTMLで操作するように改良

IEで約3倍の高速化

毎回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)