2009-01-16
jQuery1.3 の isArray 関数のような実装をするとどうなるのか計ってみた
JavaScript, performance | |
昨日の日記(さっきだけど)の続きです。毒舌なのも続いてます。
何をすべきで、それをどうやって実現するのか
jQuery1.3で、isArray や isFunction の処理が差し替えられています(昨日の日記参照)。
isArray や isFunction などは超基本的な関数なので、ここが遅くなると全体のパフォーマンスにも悪影響がでそうです。
計ってみた
TEST | IE6 | IE8 | Firefox3 | Firefox3.1(JIT) | Safari3 | Chrome1(JIT) | Opera10α |
Array#Object.prototype.toString.call | 2609 | 1311 | 878 | 947 | 2063 | 822 | 1719 |
notArray#Object.prototype.toString.call | 2672 | 1872 | 1642 | 923 | 1953 | 366 | 2016 |
"length" in array | 797 | 639 | 279 | 40 | 469 | 153 | 359 |
"length" in notarray | 828 | 1419 | 304 | 79 | 500 | 185 | 328 |
Array#instanceof | 922 | 702 | 477 | 366 | 547 | 42 | 391 |
notArray#instanceof | 937 | 858 | 486 | 382 | 531 | 42 | 391 |
スコアは、id:os0x さんのソースに、"length" in array を追加したもので計りました(文末参照)。
# os0x さん、いつもありがとうございます。
まさに JIT キラー
Firefox3.1(JIT)だと速度差はたったの23倍で、Chrome1(JIT)でもたったの20倍しか違いませんね。
IE6のメモリリークを回避するために、全てのブラウザでこれぐらいのコストを支払うのはjQueryユーザとして普通のこと……です…よ…ね?
「jQuery1.3からブラウザを意識したコードの分岐を廃止する」って方向転換しちゃったばっかりなのに、なんかひどいことになってるなぁと。
反省会
- えと「今回も Speed Up したぜベイベー」って、もしかすると大本営発表?
- 「はかったなぁシ○ア!!」とか「どこはかってるのよ!!」ってこういうときに使うセリフなんじゃないかと。
- uupaa.js の存在理由の一つに「選択肢を提供する」ってのがあります。
- 多様性(選択肢)が無くなったり脅威が無くなると、進化ってのは止まるらしいですよ。残念ながら。
何かを成長させるにはライバルや脅威を用意して同じフィールドに閉じ込めればいい → 壺毒 でしたっけ?
ソース
よりjQueryの実装に近づけるために、var toString = Object.prototype.toString; を追加しています。
<html> <body> <script type="text/javascript"> var array = []; var notarray = {}; (function(){ var S = new Date*1; var toString = Object.prototype.toString; for (var i = 0; i < 1000000;i++){ ( toString.call(array) === "[object Array]" ) } document.write('Array#Object.prototype.toString.call : ' + (new Date-S) + '<br>'); })(); (function(){ var S = new Date*1; var toString = Object.prototype.toString; for (var i = 0; i < 1000000;i++){ ( toString.call(notarray) === "[object Array]" ) } document.write('notArray#Object.prototype.toString.call : ' + (new Date-S) + '<br>'); })(); (function(){ var S = new Date*1; for (var i = 0; i < 1000000;i++){ ( "length" in array ) } document.write('"length" in array : ' + (new Date-S) + '<br>'); })(); (function(){ var S = new Date*1; for (var i = 0; i < 1000000;i++){ ( "length" in notarray ) } document.write('"length" in notarray : ' + (new Date-S) + '<br>'); })(); (function(){ var S = new Date*1; for (var i = 0; i < 1000000;i++){ (array instanceof Array) } document.write('Array#instanceof : ' + (new Date-S) + '<br>'); })(); (function(){ var S = new Date*1; for (var i = 0; i < 1000000;i++){ (notarray instanceof Array) } document.write('notArray#instanceof : ' + (new Date-S) + '<br>'); })(); </script>
トラックバック - http://d.hatena.ne.jp/uupaa/20090116/1232051707
リンク元
- 14 http://reader.livedoor.com/reader/
- 10 http://mayokara.info/deadspace/
- 6 http://b.hatena.ne.jp/entrylist
- 6 http://d.hatena.ne.jp/
- 6 http://fastladder.com/reader/
- 6 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja-JP-mac:official&hs=8zK&q=javascript+event+ie6&btnG=検索&lr=lang_ja
- 5 http://b.hatena.ne.jp/entrylist?of=100
- 5 http://www.google.co.jp/reader/view/
- 5 http://www.google.com/reader/view/
- 4 http://b.hatena.ne.jp/entrylist?sort=hot&url=http://d.hatena.ne.jp/
おとなり日記
- 2009-01-15 ぬるま湯に浸かりながら 5/28 17%
- 2009-01-14 c4se記 5/56 8%
- 2009-01-15 Griever 4/55 7%
- 2009-01-14 IkeTの日記 4/52 7%
- 2009-01-12 WEB開発日記 5/95 5%
!obj.setTimeout && !obj.nodeType && obj instanceof Array
とでもすれば、1.5倍ぐらいの速度低下で済むのにね……。
Function.prototype.__function__ = true;
これを事前に仕込んでおけば早いと思われるけど・・・。
>>1.5倍ぐらいの速度低下で済むのにね
!obj.setTimeout && !obj.nodeType && obj instanceof Array
これはいいですね。見ただけで「window と document(Node)はぜひ除外したい」って作者の意図が分かりますね。
>>Array.prototype.__array__ = true;
>>Function.prototype.__function__ = true;
prototypeの拡張を伴うとライブラリ本体には取り込まれないのかもしれません。でもこういう発想は好きです。判断する材料がなければ材料をこちらで事前に用意すればよいわけですね。
---- ここからキリトリ ----
残念。思ったよりもつれてない。
千里を走るはずの悪評をもってしても、こんだけレスが少ないところを見ると、現実のシステムに即していないJavaScriptネタをやり続けても、多くの人に声は届かないと…
>>"data URI schemeに対応しました!"とか言ってGIF限定、div追加しまくる実装のほうがよっぽど"大本営発表"だと思う。毒舌とFUDは違うと思うな。
>>こういうことを言うと経験上、「ジョークもわからないんですか」とかいわれることが多い。あと、uupaa-selector.js自体はすごいと思う。Ajaxianにメールしてみればいいんじゃないかな。
こういう御意見などをいただきました。このようなチンピラネタにフィードバックありがとうございます。
行き違いがあるといけませんので、言葉の意味と補足を追加させてくださいね。
大本営発表 → 大きな力を持つ団体が発表する悪意ある誤報。
# 一人の人間が大本営を設営できたらカッコいいので、死ぬ前にやってみたいイタズラの一つに入れておきますね。
FUD → 「自社製品より優れている競合企業の製品などに対し、不安や疑念を喚起するような印象操作を行い、消費者に購買行動を控えさせようとするマーケティング手法」by はてな
# つまりFUDとはデータを提示しなかったり、意図的に捻じ曲げた事実をもって競合を攻撃することですね。
# 競合? いやぁはずかしいなぁ(テレ。 Google先生の数字上は検索数が4桁違うので、競合というよりも「ゴミ」ですね。
# ローカルで測定したデータとソースコードは提示してるのでこのような場合は、FUD ではなくネガキャンって世間では言うかもしれませんね。
# データが事実かどうかが怪しい場合は、ご自分でもベンチ結果を数値を発表されると良いですね。
# あと、jQueryチームが公表している数値をまじめに検証している人ってどこかにいませんかね。みんなアレをストレートに信じちゃってませんか?
data URI schemeは"大本営発表" → あれはできること(メリット)とできないこと(デメリット)を明記したうえで「IEに全く存在しない機能の後付に対応した」と言ってあるわけで、isArray とは語るレベルが違いすぎてますね。
# もちょっと低いレベルでフィードバックをいただけると改善項目になりうるんですが。
「ジョークもわからないんですか」 → 今回はjQueryネタの皮をかぶった(わりとまじめな)浸透度のテストでした。大丈夫。分かってます。遊び心は大好きです。
uupaa-selector.js自体はすごいと思う → ありがとうございます。これからも、がんばります。
Ajaxianにメール → 確かに影響力がありそうです。単発で終わらせず、持続的なネタをいくつか投下できる状態になったらチャレンジしてみたいと思ってます。
ネタに突っ込み、ありがとうございました。
---- ここまでキリトリ ----