パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

IE9、SunSpiderベンチマークでズルしてる?」記事へのコメント

  • ieblog (スコア:3, 参考になる)

    by Anonymous Coward

    http://blogs.msdn.com/b/ie/archive/2010/11/17/html5-and-real-world-sit... [msdn.com]
    Dead Code Elimination in JavaScript のところにMSの言い分あり。

    • by Anonymous Coward
      で、それに対して早速Rob Sayre氏から、IE9のDead Code Eliminationは明らかにSunSpiderでしかテストされていないようだと反論 [mozilla.com]。
      • Re: (スコア:2, 参考になる)

        by Anonymous Coward
        JavaScriptではvalueOfというプロパティを定義することで、通常は副作用のない値の参照そのものに副作用を持たせることができるので、安易にDCEをしてはいけないのだが、IE9ではそのポカをやってしまっている。

        > Object.prototype.valueOf = function() { alert("IE9 is fast!"); }

        こうすると、
        a + b;
        という文はDCEされちゃいそうだが、実際はalertが二回呼ばれる(のでDCEしてはいけない)

        > That said, I don't think it's possible to consider IE9's implementation of Dead Code Elimination to be a serious general purpose optimization. It seems
        • Re: (スコア:3, 興味深い)

          JavaScriptではvalueOfというプロパティを定義することで、通常は副作用のない値の参照そのものに副作用を持たせることができるので、安易にDCEをしてはいけないのだが、IE9ではそのポカをやってしまっている。

          Dead Code Elimination for Beginners [mozilla.com] (Rob Sayre's Mozilla Blog) の話ですね。

          速度向上のために「最適化」と称して仕様違反を犯すのを擁護する気はないのですけれど、一方で「a+b;」という式文をデッドコードとして除去できない言語が広く使われているのは不幸だなあとも思います。本題と関係ありませんけど。

          • by Anonymous Coward
            DCEなんてできなくてもいいじゃんと思うけどね。
            古典的コンパイラでもデッドコードは静的なインライン展開などの結果として出てくることがほとんどだし、
            どうしてもというのならJITコンパイラがDCEするのが筋でしょう。
            • by Anonymous Coward on 2010年11月20日 0時46分 (#1861741)
              トリッキーだけどこんな方法も。

              function func(a, b) {
                      var x;
                      var i = 300;
                      while (i--) {
                          x = a + b; // dead store
                      }
                  }

              静的な解析で x = a + b; がデッドコードの候補になることがわかるから、明示的にチェックするようなコードに変換すると

                      while (i--) {
                          if (!(a has valueOf) && !(b has valueOf)) {
                              // dead store
                          } else {
                              x = a + b;
                          }
                      }

              ここでif文の条件式はループ不変式だから

                      if (!(a has valueOf) && !(b has valueOf)) {
                          while (i--) {
                              // dead code
                          }
                      else {
                          while (i--) {
                              x = a + b;
                          }
                      }

              と古典的最適化でもお望みのものが得られる。あんまり意味はないと思うが。

              この場合はxの生存範囲がわかっているからノーチェックだが、一般的にはxに対するセッターのチェックも必要。
              親コメント
              • by Anonymous Coward
                おっと、これではだめだ。
                Objectにセッターやゲッターが設定されていて、それがaやbを更新するような関数である可能性が捨てきれないから、DCEできる条件はより厳しくなるね。

アレゲは一日にしてならず -- アレゲ研究家

処理中...