簡易的なuniqメソッド(文字列限定)を書いたので、underscore.jsのuniqメソッドとベンチマーク取ってみました
グリモンを書いてて、uniqメソッドを自前で作ろうと思ったのですが、少し面白い方法を見つけたので、jsPerfでベンチマークしてみました。文字列専用ですが。
自前のuniqメソッド
オブジェクトを構築する際に、キーはひとつのオブジェクトに対してユニークになるので、適当な値を突っ込んでオブジェクトを構築し、最後にキーだけ取り出す感じです。reduceを使えば、4行程度で書けます。
まとめ
文字列限定ですが、underscore.jsのuniqメソッドで、最適化オプションなしの状態より速い場合が多いようです。
ただ、Google Chromeでは、underscore.jsの最適化オプションがfalseでも、今回作ったuniqメソッドよりも速いので、実用的かどうかは微妙なところです。
Object.keysメソッドが遅いのかな?それとも、バイナリサーチが得意なのかな?よくわかりません。
追記
@hokaccha さんとのやり取り。
@taiju reduceのコストが高いのかなーと思ってforでやってみました。ブラウザによってはunderscoreより速いですね。 bit.ly/VWH6Ka
— Kazuhito Hokamura (@hokaccha) November 12, 2012
@hokaccha ありがとうございます!やっぱ、速度求めるとどうしてもforに軍配があがるんですねー。isSorted=trueのバイナリサーチより速いスコアが出てるブラウザがあるとは、分岐等の処理のコストは結構あるんですね。
— taiju (id:jdg) (@taiju) November 12, 2012
@taiju 分岐のコストというよりeachでループ毎に無名関数でスコープつくるにコストかかってるんじゃないかと思います。reduceよりforのが速いのも同じ理由な気がします。
— Kazuhito Hokamura (@hokaccha) November 12, 2012
@hokaccha 追加してみたんですけど、無名関数のコストはそんなにないっぽいです。reduce遅いのかな。 jsperf.com/string-uniq-fo…
— taiju (id:jdg) (@taiju) November 12, 2012
@taiju なるほどー。関数呼び出しのコストかなーと思ったんですけどブラウザによって違いすぎてよくわからなくなってきましたw bit.ly/ZeOH6E
— Kazuhito Hokamura (@hokaccha) November 12, 2012
@hokaccha Chromeが一番謎なスコアな気がしますけど、ほんとよくわかんないですねw
— taiju (id:jdg) (@taiju) November 12, 2012
@taiju たぶんV8の謎な高速化が働いてるんでしょうねw
— Kazuhito Hokamura (@hokaccha) November 12, 2012
悔しいですけど、for速いですね。