鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

またまた「perlで配列の引き算」をやってみた

「perlで配列の引き算」をやってみたで、さらに違うアルゴリズムでやっていたので、面白そうだから、さっそくベンチ。 (array_minus2としています。ただし、sort済み前提)

              Rate  array_diff array_minus  acme_tools array_minus2
array_diff  2.43/s          --        -50%        -83%        -91%
array_minus 4.86/s        100%          --        -65%        -82%
acme_tools  13.9/s        474%        187%          --        -48%
array_minus2 26.7/s       1002%        450%         92%          --

アクメToolsを抑えてトップスコアをたたき出しました。 並び替えておくと早いんですな。

ソートしながら配列に挿入する方法が多分ありそうだなぁ。 algorithm - ソート済み配列をソートしなおすべからず perlでモジュールないかな。 この辺は、まだまだ学習余地がいっぱいありそう・・ ぼちぼち調べていこう。

さて、sortをはさんだら、AcmeToolがやはり早い。ただ、Acme::Toolsは ハッシュに変換してから処理するのでメモリ的には消費すると思われ これもまた単純比較はできませんね。

               Rate   array_diff  array_minus array_minus2   acme_tools
array_diff   3.68/s           --         -52%         -77%         -82%
array_minus  7.63/s         107%           --         -52%         -62%
array_minus2 16.0/s         335%         110%           --         -20%
acme_tools   20.1/s         445%         163%          25%           --

外部のキーバリューストアを使う場合に、キーバリューストアにソートを頼むとか、そういう使い方をすればいいかも。キーバリューストアそのものに、配列の引き算機能があるかもかもだけど。。

Redisにはsdiffというコマンドがあった! http://redis.shibu.jp/commandreference/sets.html#command-SDIFF

というわけで、RedisのSDIFFを使ってみた。驚愕のスピードですが、 データを入れるところはカウントしていません。 そもそも、データをRedisに格納しているならば、 素直にRedisを使うべしですなぁ。

                           Rate          array_diff        array_minus       array_minus2         acme_tools redis
array_diff               2.32/s                  --               -54%               -80%               -83% -100%
array_minus              5.09/s                119%                 --               -56%               -64% -100%
array_minus2             11.4/s                392%               125%                 --               -18% -100%
acme_tools               14.0/s                501%               175%                22%                 -- -100%
redis        5000000000000000/s 215199999999999968% 98300000000000048% 43700000000000032% 35800000000000012%    --