Hatena::ブログ(Diary)

文殊堂 このページをアンテナに追加 RSSフィード Twitter

2008-10-16

The Performance of Dynamic Site (id:amachang)

JJUG Cross Community Conference 2008 Fall - Sessions

概要

  • JavaScriptの誤解
  • 重くしている犯人
  • プロファイラ

JavaScriptの誤解

重くしている犯人

  • DOM
    • DOMをフェーズに分けて考える

  1. JavaScriptコンポーネント(C++)との通信(取得)
  2. DOMノードの追加、値の変更
  3. スタイルの計算
  4. レイアウトの計算

XPConnectやCOMとの通信

単純なプロパティアクセスの数十倍(IE以外は無視しておk)

COMは重い

通信回数=DOMオブジェクトの「.」の数

取得の場合と同じ「.」の数

ノードに変更したというフラグが立つ

parent.appendChild(child)だとparentとchildにフラグが立つ。

重要:再計算がJavaScriptの実行後に行われる事がある

JavaScript内でのベンチやプロファイリングが役に立たない

  • スタイルの計算

一番最適化が効く所

    • 変更フラグが経っているノードがあるままJavaScriptが終了した
    • 変更フラグが経っている状態でスタイルの再計算が必要な操作が行われた
      • offsetWidthの取得とか

「変更→再計算が必要な操作(取得)→変更」というのが癌


再計算が行われる代表的操作

再計算が行われる範囲

classを設定した場合

自身・子孫・弟・弟の子孫

styleプロパティの直接書き換え

自身・継承されている要素

styleプロパティの書き換えの方がclassの書き換えより速い。でも汚い。

Webkitを自分でビルドしてdebug出力すれば再計算の起こったタイミングも調べられますよ。

激しく重い

先祖要素も考えないといけないから

プロファイラ

何が重いとかより何度も何度も呼ばれてCPU時間を食ってる所をチューニング

JUIでもあった話(測りたい部分を適当な名前を付けた関数のその場定義&呼び出し)


ただ闇雲にチューニングするのは辞めよう

ご利用は計画的に

Q&A

rokujyouhitomarokujyouhitoma 2008/10/16 17:15 おお。出れないからまとめてくれるのはありがたい!

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証