icon私はかつてFlashをいじっていたのですが、その頃はマシンの性能もあまり良くはなく、Flashの実行エンジン自体もそこまで高速ではなかったので、様々な高速化テクニックに頼ることもありました。あの頃の高速化テクニック、今のJavaScript通用するのかな、と。今や超高機能なプロセッサと超高速な実行エンジンで動くモンスターと化してしまったJavaScriptですが、かつての兄弟(ActionScript)の技を受け継ぐことができるのでしょうか。さいごに注意事項この記事はノルタルジー重点です。真面目に計測してないです。いうかこの記事に書いてあるような高速化は、仮に効果があったとしても実務では絶対に使わないでください。夜道で刺されると思います。しようもなく読みにくくなるので......。計測はChromeとFirefoxで行います。計測関数は以下のようなものを準備しました。経過時間がミリ秒で返る}こんだけ回すと途中で妙な最適化が入る可能性はありますが、まあ、参考程度ということで。やってみるループのアンロールループのアンロール(unroll)という言葉を聞いたことがあるでしょうか。アンロールとは展開のことで、例えば普通はforループで10回まわすところを、10行に分けて書いてループをなくす......というような処理を指します。昔は良く使われてたようです。ループによるジャンプや条件判定を減らすことにより性能の向上が望める、というのが理屈ですが、JavaScriptというかなり高級な環境で、しかも今時の実行エンジンで効果があるかは怪しいところです。ちなみにかつてのFlashではめちゃくちゃ効果がありました。sum;}結果は......。アンロールした方が速いみたいです。今回はループ内の処理が単純ということもあって速度に直結しやすかっただけという事情もあるので、処理がもう少し複雑になってくるとわからないですね。ループ内に大きめの関数呼び出しとか入ると実行エンジンの最適化の度合いも変わってくるでしょうし。ループ内の規模によって大きく変わってくるでしょうし、あくまで参考値ということで。ルックアップテーブル(LUT)計算コストの高いものをあらかじめ計算しておいてあとで使い回す、というのがルックアップテーブルになります。これは今でも分野によっては使われてるんじゃないですかね。昔だと三角関数のルックアップテーブルを作るのがよくありました。角度(整数に限定する)に対して三角関数の値が格納されている配列を作るというやつです。今ではどうなんでしょうね。聞かなくなりましたね。649ええぇ......。これも効果あるんですか。Math.cosが遅いのかな。これ場合によっては普通に実用できるのではという気分にもなりますね。Math.max/Math.minより条件分岐FlashだとMath.maxとminが異様に遅いという現象がありました。ifを使った方が速かった記憶があります。JavaScriptだとどうなんでしょ。1198あんまり変わらないですね。素直にMath.max/min使いましょう。ビット演算Flashでは普通に計算するよりもビット演算の方が速いことがありました。この辺りの最適化って普通はコンパイラや実行エンジンの仕事だと思うんですが、Flashくんは特に何もしてくれませんでした。簡単な例として「1とAND取ると偶奇判定できる」というのがあります。718ビット演算の方が遅いですね。%も%で重い処理のはずですが、JavaScriptのビット演算は数値を32bitの整数に変換する処理が入るから......とかですかね。falseになっていたわけで、そりゃ遅いですよね。685(追記続き)ビット演算の方がちょろっと速いですね。普通の余りの計算が高速化されてるのか、ビット演算が遅いのかはわかりませんが、ほとんど差はないですね。さいごに当初の目的だと完全に冷やかしというか、「もうこういう手法は時代遅れだよね〜」って再確認するための記事だったのですが、意外と性能出る手法もあってビビってます。V8とかもうカリカリにチューニングされてるイメージしかなくて、こういう小手先のテクニックが効くとは全く思っておらず......。Flashでの最適化というとオブジェクトのプーリングなんてのもあったのですが、普通に性能出るのわかりきってるのと、扱う対象作るの面倒なので省きました。あとFlashで多かったのは画像処理周りですね。速度出すためにいろんな工夫してました。Flashに特化した最適化だったのでcanvasに応用できる部分がほとんどないんですよね。そんなこんなで、意外な発見がある実験でした。将来何が役にたつかわからんもんですね。冒頭にも書きましたが、こんな重箱の隅突くような最適化はできるだけ実務では避けてください。いった妙な最適化はコードの可読性を損ないます。重大なボトルネックがあるならば、先にそちらを解決すべきです。細かい最適化は手を出すにしても最初の最後にしましょう。その4:オブジェクト指向JavaScriptでよく見るエラーとその対策RSSプロフィール古都ことふるみやことです。フロントエンドとかいろいろやるよ。