以下斜め読んだ内容

pseudo translation of useful posts, book reviews, remarks,etc. twitter: feeddict

斜め読み

JavaScript variable performance

NCZonlineより。斜め読みするには力が足りなかったで、付け焼刃してから再度斜め読んだ。
グローバル変数よりローカル変数使った方が実行速度が速いという件について

  • スコープチェーンについて復習し、
  • スコープの深さに応じて速度がどう変化するのかのベンチマークをブラウザ別にとって
  • 指針について書く

という3部構成。以下斜め読んだ内容。

  • スコープチェーンの復習
    • 関数実行時に、アクティベーションオブジェクトが生成
      • 中身は、ローカル変数、引数、arguments、thisで構成
    • 識別子(変数名、プロパティ名)の解決のステップ
      • アクティベーションオブジェクト内部のプロパティを探してから、無かったら、次にグローバルオブジェクト内部のプロパティを探す。という順番。
      • スコープの内部を探して、無かったら、スコープの外部のオブジェクト(グローバルオブジェクトetc.)を探す。
      • スコープの内部を探して、次にその外側のスコープを探す。
      • ECMASCRIPT262の仕様では、こういうステップを辿るように規定されてないが、ブラウザの実装ではこうなってる。
  • スコープチェーンが深くなると、辿り歩くスコープの数が増え、探すプロパティの数も増える。
    • スコープチェーンの深さとjavascriptの実行速度はどうなってるのか。深くなれば遅くなるのか。影響は無視できるほど小さいのか。
  • ベンチマークをプロパティのReadとWriteの2つについてとってみた
    • webkit528以降、operaはスコープの深さに速度がほとんど影響受けない。
      • Operaよりもwebkitの方が速いが。影響の受けなさは同じく
    • ieはスコープの深さに比例して速度が遅くなる
    • FxもIEよりはずっと速いがスコープの深さに比例して遅くなる
  • Operaを除く全ての正式版のブラウザは、スコープの深さに比例して実行速度が遅くなる
  • どうすればいいか
    • スコープ外部の変数を何度も参照するときは、ローカル変数に保存しておく
    • with文とスコープチェーン
      • 実行コンテキストにおけるスコープチェーンが一時的に拡大する
      • 一時的にだが、スコープの先頭に新しい変数オブジェクトを追加するため。
      • ローカル変数のスコープが1つ深くなる
      • パフォーマンス上のデメリットがあることを留意
    • try〜catch文とスコープチェーン
      • catchブロックはwith文と同じ形でスコープチェーンを拡大する
      • try部分を実行している限りは、速度低下なし。
      • エラーが出ない限りは、スコープチェーンの拡大はない。

Java Script Variable Performance

上のブログエントリの内容で発表したときのスライド

YouTube - Silicon Valley JavaScript Meetup - January 21, 2009

上のブログエントリの内容を発表したときいの動画。11分くらいから登場するが早口すぎて、聞き取れません。

備考1

NCZonlineには、テストコードを公開してほしい。

備考2

JavaScript性能評価ツールJSLitmus、ローカル/外部変数で性能差 | エンタープライズ | マイコミジャーナル
ローカル/外部変数で5倍から25倍差が出たとのことだが、webkitのナイトリで検証したらどうなるんだろう?と思った