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つの推測を立てている。
- SunSpiderでのIE9の良パフォーマンスは意図的なものである(Hacker Newsにおけるこの説の見解)
- マイクロソフトの開発者らは、パフォーマンスチェックのためにSunSpiderを利用しており、意図せずSunSpider向けに調整してしまった
- 「true」や「return」を挿入することでパフォーマンスが著しく低下するのは、キャッシュテーブル調整におけるバグである(Hacker Newsにおけるこの説の見解)
ieblog (スコア:3, 参考になる)
http://blogs.msdn.com/b/ie/archive/2010/11/17/html5-and-real-world-sit... [msdn.com]
Dead Code Elimination in JavaScript のところにMSの言い分あり。
Re: (スコア:0)
つまり
4. 自動最適化により無意味な演算を検知してスキップしてたのが、「true」や「return」が挿入されたせいでスキップに失敗してベンチマークスコアが低下した。
ということ?
Re: (スコア:0)
まぁ、コレが真実だとすると、理由としては「3」に近いものとも言えるかもですね。
# しかしまぁ、古今東西みんな陰謀論好きねぇ。
Re: (スコア:0)
マイクロソフトは陰謀を企ている程度でよかったじゃないですか。
某企業の、信仰者に仕立て上げるみごとなカルト教団っぷりに比べれば。
Re: (スコア:0)
Re: (スコア:0)
まあ元々というかIE9の前はJavaScriptエンジンには不思議なくらい力を入れてなかったからねえ。重大な戦略ミスだったけど。
Re:ieblog (スコア:1, 興味深い)
COMベースで汎用的に様々なアプリケーションから利用・拡張できるように作られているという点では、かなり力が入ってます。
Re:ieblog (スコア:1, 参考になる)
ところがIE9からはJavascriptだけブラウザ内蔵になりました。
COMベースのJScriptは呼び出しのオーバーヘッドがバカにならなくて、、、
置いてきぼりのVBScriptがかわいそう。
Re: (スコア:0)
Re: (スコア:0)
まだ正式版でないIE9に何を期待してるのか知りませんが、品質面でまだまだなのは当たり前・・・じゃなきゃとっくに正式版として公開してるでしょう
Re: (スコア:0)
Re:ieblog (スコア:2, 参考になる)
> 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, 興味深い)
Dead Code Elimination for Beginners [mozilla.com] (Rob Sayre's Mozilla Blog) の話ですね。
速度向上のために「最適化」と称して仕様違反を犯すのを擁護する気はないのですけれど、一方で「a+b;」という式文をデッドコードとして除去できない言語が広く使われているのは不幸だなあとも思います。本題と関係ありませんけど。
Re:ieblog (スコア:2)
> 一方で「a+b;」という式文をデッドコードとして除去できない言語が
コンパイラならこういうコードを警告の対象にできるけど
インタープリタの場合、どうすべきなんだろう?
Re:ieblog (スコア:1, 参考になる)
> > 一方で「a+b;」という式文をデッドコードとして除去できない言語が
> コンパイラならこういうコードを警告の対象にできるけど
> インタープリタの場合、どうすべきなんだろう?
最初のparse時にvalueOfプロパティが定義されていなくても動的に追加されるかもしれませんし、evalとかECMAScriptの言語仕様上は結びついてないけどsetTimeoutやDOMイベント経由で結びついてるコードパスとか考えると、要するに不可能ってことです。
C++でもoperator+()が定義されていればどんなフリーダムなことでも出来ますが、ある程度は静的解析で何とかなります。
Re:ieblog (スコア:1, 参考になる)
C++でもoperator+()が定義されていればどんなフリーダムなことでも出来ますが
重箱の隅をつつくようですがC++のoperatorは差し替えどころかvirtualが許されていません。
「operator+()が定義されていればどんなフリーダムなことでも」というような特別なものではなく、ただの関数です。
なので、my_add()だろうがoperator+()だろうが、最適化の可能性は平等です。
Re: (スコア:0)
敢えてやるとすれば、初回コンパイル時にvalueofが無ければ最適化されたコードを出しておいて、関係する値のvalueofが更新されたらon-the-flyで再コンパイルするとか。
Re: (スコア:0)
古典的コンパイラでもデッドコードは静的なインライン展開などの結果として出てくることがほとんどだし、
どうしてもというのならJITコンパイラがDCEするのが筋でしょう。
Re: (スコア:0)
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
いっそwell known codeは (スコア:2, 興味深い)
世の中のWebサイトのJavaScriptのコードのうち、かなりがツールによって自動的に生成されて埋め込まれたものだろうから、それらは別扱いでいいかと。
ついでに、well known code以外は実行しないというセキュリティ設定もできると、いいなぁ。
Re:いっそwell known codeは (スコア:2)
Re:いっそwell known codeは (スコア:1, おもしろおかしい)
…ん?真にwell knownなコードだったら、いちいちサーバサイドから転送する必要なくね?
世界中のwell knownコードに通し番を振って、「0x1e番のコードを実行」ってことにすれば1バイト転送で済むぞ(´・ω・`)これはオトクだ!
# しかもすでにTHcompで公知の技術だからpatent unencumberedだという特典付き(`・ω・´)
Re:いっそwell known codeは (スコア:1, 興味深い)
CDNを利用したJavaScriptライブラリの転送です。
GoogleやMicrosoftなどによりホストされており、自サイトからCDN上のライブラリを指定できます。
これは普及するほど、同じライブラリが他のサイトで利用されていて、
ブラウザにキャッシュされている可能性が高まるので高速化が期待できます。
が、あまり知られてないのが残念ですね。
Re: (スコア:0)
例えば、MS製のものでは、InPriveteフィルタとか、Microsoft Security Essentialsとか。
Re: (スコア:0)
私の推測 (スコア:2)
コンパイル済みの専用コードが実行される。
Re:私の推測 (スコア:1)
Re:私の推測 (スコア:1, おもしろおかしい)
Re: (スコア:0)
WindowsにSunSpiderの実行に適した実装を施している。
Re: (スコア:0)
結論:ブラウザ開発者は検出コードに開発力を注ぐべきである
こんなの (スコア:2, すばらしい洞察)
わざわざ話題に出す様なものでもない様な…
Re: (スコア:0, フレームのもと)
まがりなりにも世界でも最大級のソフトウエアベンダーが、
>>SunSpiderはアップルによって開発されたベンチマークテスト
を使って自社製品のベンチマークテストをやって、それに最適化しているというのは、
どこの企業がやっていてもスキャンダルには変わりないと思いますよ。
Re:こんなの (スコア:1, すばらしい洞察)
SunSpiderはベンチマークのスタンダードと曲がりなりにも業界的に認められていますから、あんたのは言いがかり以外の何ものでもないですね。
Operaga? (スコア:2)
ベンチマークなんてそんなもの (スコア:1)
>ベンチマークに向けた最適化、というのはよくある話部門より
部門名の指し示すようにベンチマークによる評価なんて参考程度ですよね
Re:ベンチマークなんてそんなもの (スコア:1)
業務システムでのベンチマークだと, 既存のプログラムから代表的な条件の物を抽出して行ったりするんですけどね.
もちろん性能向上のためのチューンは有りという前提で, そのチューン自体の大小も評価項目となるわけですけど.
Re:ベンチマークなんてそんなもの (スコア:1)
>ベンチマークによる評価なんて参考程度ですよね
それでいいじゃなイカ
事前のもので、完全な判断はできないからね。
これとこれを参考にして、こうすればよくなる...
あれ?足りなかったな、じゃこうすればいいかな?
をやっているわけだろ?
速いに越したことはないが (スコア:1)
IE8みたいに遅いのは論外として、ちゃんと動いてくれればいいです。
他のブラウザに問題がないわけじゃないけど、
IEは8でも使えない機能とか意味不明のバグが多すぎ…
2番じゃダメなんですか? (スコア:0)
Re:2番じゃダメなんですか? (スコア:2, 参考になる)
そんなに古いベンチマークだっけ、と見てみたら、初登場が 2007年12月なんですね。
新しいJavaScriptベンチ「SunSpider」が登場 2007/12/20 [mycom.co.jp]
ドッグイヤーなこの世界とはいえ、陳腐化すさまじいです。
上記記事によると、SunSpider が開発された動機は「自分たちのニーズを満たすものが存在しなかったから」だそうですが、陳腐化してしまったとなると、置き換わるツールはどんなのがあるんでしょう。
Re: (スコア:0)
もじらの中の人も必死なのかな (スコア:0)
ついこないだまでFirefoxが最もJavaScriptのパフォーマンスが悪いブラウザだったし、てかJaegerMonkey作るのにJavaScriptCoreからコード拝借してる始末だし。
Re:もじらの中の人も必死なのかな (スコア:2)
>ついこないだまでFirefoxが最もJavaScriptのパフォーマンスが悪いブラウザだったし、
ソースが欲しいな。
具体的に何年何月から何年何月頃かくらいの情報は記述して欲しい。
この書き方では、「ついこないだ」ってのが2年前なのか10年前なのかも分からんぞ。
#10年前じゃFirefoxはなかったかな。
Re:もじらの中の人も必死なのかな (スコア:1, 参考になる)
たぶんこれ [betanews.com]のことじゃないかな。IE8のダメっぷりが目立つけど。
コード拝借してる始末って (スコア:0)
良いもので各種条件を満たしているならば、コードを貰ってきても別に構わないんじゃ?
許容できないくらいに各種条件を満たしていないなら話は別ですが、それで良いなら貰った方がゴールへ速く進んでいける訳だし。
Re: (スコア:0)
自分じゃ作れなかったからよそから拝借してるだけの話。言語処理系に強い開発者があのプロジェクトには不足しているってことです。
Re: (スコア:0)
いや、だからそのコメントに対しても #1861627 [srad.jp] と同じコメントをつけるしかないんだけど。
貰ってきているからって、だからそれが何?って事。
あらゆる課題に対して自作で解決する事がプロジェクトの目的ならば貰ってくる行為はギブアップ宣言みたいなものだけど、そうじゃないんだからさ。
Re: (スコア:0)
全部NOPで計ればいい (スコア:0, おもしろおかしい)
ごめんなさい。
日本語が不自由 (スコア:0)