パスワードを忘れた? アカウント作成
275130 story
プログラミング

IE9、SunSpiderベンチマークでズルしてる? 74

ストーリー by hylom
ベンチマークに向けた最適化、というのはよくある話 部門より

cheez 曰く、

IE9がSunSpiderベンチマークで「ズル」をして、実際よりもよいパフォーマンスを出しているのではないか? ということが本家/.にて話題になっている。

SunSpiderはアップルによって開発されたベンチマークテストであり、ブラウザのJavaScriptエンジンのパフォーマンスを計るのによく使われている。このベンチマークでIE9がずば抜けてよいパフォーマンスを出しているそうなのだが、これが意図的な細工のではないかとの推測がdigitizorにて紹介されている。

これによると、MozillaのエンジニアRob Sayre氏がFirefox 4のテストを走らせていたところ、SunSpiderのmath-cordicテストにおいてChromeやOperagaのスコアは10ミリ秒だったのに対し、IE9のスコアが1ミリ秒と著しく速い結果となることに気付いたとのこと。そこでSayre氏がオリジナルのコードに「true」と「return」を付け加えた2パターンを作成し同じように実行したところ、IE9のパフォーマンスが著しく低下したそうだ。なお、ChromeやOperaへの影響は格段に少なかったとのこと。

「true」も「return」もコード的には特に意味はなく、影響は少ないはずなのだがこのような結果となったことに対し、digitizorでは3つの推測を立てている。

  1. SunSpiderでのIE9の良パフォーマンスは意図的なものである(Hacker Newsにおけるこの説の見解
  2. マイクロソフトの開発者らは、パフォーマンスチェックのためにSunSpiderを利用しており、意図せずSunSpider向けに調整してしまった
  3. 「true」や「return」を挿入することでパフォーマンスが著しく低下するのは、キャッシュテーブル調整におけるバグである(Hacker Newsにおけるこの説の見解
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • ieblog (スコア:3, 参考になる)

    by Anonymous Coward on 2010年11月19日 15時43分 (#1861511)

    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

      つまり

      4. 自動最適化により無意味な演算を検知してスキップしてたのが、「true」や「return」が挿入されたせいでスキップに失敗してベンチマークスコアが低下した。

      ということ?

      • by Anonymous Coward

        まぁ、コレが真実だとすると、理由としては「3」に近いものとも言えるかもですね。

        # しかしまぁ、古今東西みんな陰謀論好きねぇ。

        • by Anonymous Coward

          マイクロソフトは陰謀を企ている程度でよかったじゃないですか。
          某企業の、信仰者に仕立て上げるみごとなカルト教団っぷりに比べれば。

        • by Anonymous Coward
          SPECベンチマークのコードを認識してスペシャルコードを吐く商用コンパイラの噂も昔ありましたが…
    • by Anonymous Coward
      で、それに対して早速Rob Sayre氏から、IE9のDead Code Eliminationは明らかにSunSpiderでしかテストされていないようだと反論 [mozilla.com]。
      • Re:ieblog (スコア:2, 参考になる)

        by Anonymous Coward on 2010年11月19日 21時52分 (#1861693)
        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 clear that it hasn't been tested on anything other than SunSpider.

        つまり、IE9の開発者は上記の事実に気がついていなくて、SunSpiderだけでチェックして安心しているという状態のようだ。升しているわけではなさそうだよ。
        親コメント
        • Re:ieblog (スコア:3, 興味深い)

          by fcp (32783) on 2010年11月19日 23時23分 (#1861714) ホームページ 日記

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

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

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

          親コメント
          • by CowardDuck (25674) on 2010年11月20日 1時10分 (#1861747)

            > 一方で「a+b;」という式文をデッドコードとして除去できない言語が

            コンパイラならこういうコードを警告の対象にできるけど
            インタープリタの場合、どうすべきなんだろう?

            親コメント
            • Re:ieblog (スコア:1, 参考になる)

              by Anonymous Coward on 2010年11月20日 2時23分 (#1861758)

              > > 一方で「a+b;」という式文をデッドコードとして除去できない言語が
              > コンパイラならこういうコードを警告の対象にできるけど
              > インタープリタの場合、どうすべきなんだろう?
              最初のparse時にvalueOfプロパティが定義されていなくても動的に追加されるかもしれませんし、evalとかECMAScriptの言語仕様上は結びついてないけどsetTimeoutやDOMイベント経由で結びついてるコードパスとか考えると、要するに不可能ってことです。
              C++でもoperator+()が定義されていればどんなフリーダムなことでも出来ますが、ある程度は静的解析で何とかなります。

              親コメント
              • Re:ieblog (スコア:1, 参考になる)

                by Anonymous Coward on 2010年11月20日 9時22分 (#1861801)

                C++でもoperator+()が定義されていればどんなフリーダムなことでも出来ますが

                重箱の隅をつつくようですがC++のoperatorは差し替えどころかvirtualが許されていません。
                「operator+()が定義されていればどんなフリーダムなことでも」というような特別なものではなく、ただの関数です。

                なので、my_add()だろうがoperator+()だろうが、最適化の可能性は平等です。

                親コメント
              • by Anonymous Coward

                敢えてやるとすれば、初回コンパイル時にvalueofが無ければ最適化されたコードを出しておいて、関係する値のvalueofが更新されたらon-the-flyで再コンパイルするとか。

          • by Anonymous Coward
            DCEなんてできなくてもいいじゃんと思うけどね。
            古典的コンパイラでもデッドコードは静的なインライン展開などの結果として出てくることがほとんどだし、
            どうしてもというのならJITコンパイラがDCEするのが筋でしょう。
            • by Anonymous Coward
              トリッキーだけどこんな方法も。

              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 value
  • by Anonymous Coward on 2010年11月19日 16時13分 (#1861529)
    いっそwell known codeは内蔵のネイティブなバイナリで処理していいんじゃない?
    世の中のWebサイトのJavaScriptのコードのうち、かなりがツールによって自動的に生成されて埋め込まれたものだろうから、それらは別扱いでいいかと。
    ついでに、well known code以外は実行しないというセキュリティ設定もできると、いいなぁ。
    • by gabill (29206) on 2010年11月19日 19時13分 (#1861633)
      MSはjQueryに力入れるみたいだし、フレームワークまるごと最適化の対象にしちゃえば需要ありそうですね。 そしてそのうちフレームワークの内部限定でJavascriptの制限を超えた機能を実装して、 IE独自拡張の悪夢再び。
      親コメント
    • Re:いっそwell known codeは (スコア:1, おもしろおかしい)

      by Anonymous Coward on 2010年11月19日 19時39分 (#1861643)
      今度は「『実行しようとしているコードがwell knownかどうか』を判断するコスト」が問題になりそうですね。

      …ん?真にwell knownなコードだったら、いちいちサーバサイドから転送する必要なくね?
      世界中のwell knownコードに通し番を振って、「0x1e番のコードを実行」ってことにすれば1バイト転送で済むぞ(´・ω・`)これはオトクだ!

      # しかもすでにTHcompで公知の技術だからpatent unencumberedだという特典付き(`・ω・´)
      親コメント
      • by Anonymous Coward on 2010年11月21日 11時51分 (#1862060)
        実は既知のライブラリ転送を軽減する試みはすでに始まってますよ。

        CDNを利用したJavaScriptライブラリの転送です。
        GoogleやMicrosoftなどによりホストされており、自サイトからCDN上のライブラリを指定できます。

        これは普及するほど、同じライブラリが他のサイトで利用されていて、
        ブラウザにキャッシュされている可能性が高まるので高速化が期待できます。

        が、あまり知られてないのが残念ですね。
        親コメント
    • by Anonymous Coward
      一部のwell known codeを実行しないというのならありますよね。
      例えば、MS製のものでは、InPriveteフィルタとか、Microsoft Security Essentialsとか。
      • by Anonymous Coward
        そういうブラックリスト方式は、ゼロデイ攻撃に対して脆弱なので、ホワイトリスト方式がいいと思います。
  • by reininn (35924) on 2010年11月19日 16時15分 (#1861531)
    SunSpider のコードを検出すると、
    コンパイル済みの専用コードが実行される。
  • こんなの (スコア:2, すばらしい洞察)

    by Anonymous Coward on 2010年11月19日 17時11分 (#1861567)
    どこのメーカーでもやってる事でしょ
    わざわざ話題に出す様なものでもない様な…
    • Re: (スコア:0, フレームのもと)

      まがりなりにも世界でも最大級のソフトウエアベンダーが、

      >>SunSpiderはアップルによって開発されたベンチマークテスト
      を使って自社製品のベンチマークテストをやって、それに最適化しているというのは、
      どこの企業がやっていてもスキャンダルには変わりないと思いますよ。

      • Re:こんなの (スコア:1, すばらしい洞察)

        by Anonymous Coward on 2010年11月20日 8時31分 (#1861795)
        自作自演なベンチマークなんかよりよっぽど公正ですが。

        SunSpiderはベンチマークのスタンダードと曲がりなりにも業界的に認められていますから、あんたのは言いがかり以外の何ものでもないですね。
        親コメント
  • by ef (25263) on 2010年11月20日 19時43分 (#1861952)
    Operagaってラテン語かなんか?
  • >ベンチマークに向けた最適化、というのはよくある話部門より

    部門名の指し示すようにベンチマークによる評価なんて参考程度ですよね

  • IE8みたいに遅いのは論外として、ちゃんと動いてくれればいいです。
    他のブラウザに問題がないわけじゃないけど、
    IEは8でも使えない機能とか意味不明のバグが多すぎ…

  • by Anonymous Coward on 2010年11月19日 15時45分 (#1861512)
    いやマジでSunSpiderって今やスパコンのTOP500並みに役に立たないベンチマークでしょ?
    • by nomnom (26419) on 2010年11月19日 16時06分 (#1861525) 日記

      そんなに古いベンチマークだっけ、と見てみたら、初登場が 2007年12月なんですね。
      新しいJavaScriptベンチ「SunSpider」が登場 2007/12/20 [mycom.co.jp]
      ドッグイヤーなこの世界とはいえ、陳腐化すさまじいです。

      上記記事によると、SunSpider が開発された動機は「自分たちのニーズを満たすものが存在しなかったから」だそうですが、陳腐化してしまったとなると、置き換わるツールはどんなのがあるんでしょう。

      親コメント
      • by Anonymous Coward
        そのためにKraken JavaScript Benchmarkを立ち上げたんじゃなかったっけ?
  • by Anonymous Coward on 2010年11月19日 15時56分 (#1861518)

    ついこないだまでFirefoxが最もJavaScriptのパフォーマンスが悪いブラウザだったし、てかJaegerMonkey作るのにJavaScriptCoreからコード拝借してる始末だし。

    • >ついこないだまでFirefoxが最もJavaScriptのパフォーマンスが悪いブラウザだったし、
      ソースが欲しいな。

      具体的に何年何月から何年何月頃かくらいの情報は記述して欲しい。
      この書き方では、「ついこないだ」ってのが2年前なのか10年前なのかも分からんぞ。
      #10年前じゃFirefoxはなかったかな。

      親コメント
    • 良いもので各種条件を満たしているならば、コードを貰ってきても別に構わないんじゃ?

      許容できないくらいに各種条件を満たしていないなら話は別ですが、それで良いなら貰った方がゴールへ速く進んでいける訳だし。

      • by Anonymous Coward

        自分じゃ作れなかったからよそから拝借してるだけの話。言語処理系に強い開発者があのプロジェクトには不足しているってことです。

        • by Anonymous Coward

          いや、だからそのコメントに対しても #1861627 [srad.jp] と同じコメントをつけるしかないんだけど。

          貰ってきているからって、だからそれが何?って事。
          あらゆる課題に対して自作で解決する事がプロジェクトの目的ならば貰ってくる行為はギブアップ宣言みたいなものだけど、そうじゃないんだからさ。

    • by Anonymous Coward
      おっと、GNUカーネルの悪口はそこまでだ
  • 全部NOPで計ればいい (スコア:0, おもしろおかしい)

    by Anonymous Coward on 2010年11月19日 17時20分 (#1861574)

    ごめんなさい。

  • by Anonymous Coward on 2010年11月19日 20時30分 (#1861672)
    意図的な良パフォーマンスって何よ
typodupeerror

一つのことを行い、またそれをうまくやるプログラムを書け -- Malcolm Douglas McIlroy

読み込み中...