これを見て、Closure知らんけど面白いなーと過ごしていました。
パスワード問合せシステムを作る (clojureのreducers) - Qiita
そしたら、こんな記事があり。
徳丸浩の雑記帳: 数字6桁パスワードのハッシュ値の総当たり、PHPなら約0.25秒で終わるよ
Javaもありそうだなーと過ごしていたら。こんなツイートが流れてきたので。
Clojureと同じ手法をJava版に適用。こちらは0.5秒くらい。 >MD5ハッシュ突き合わせ(Java版) https://t.co/Nm3z3JZkvh
— やのつとむ (@t_yano) 2014, 2月 10
@t_yano findPasswordメソッドでpwをbyte配列に変換して比較するともっと速くなりました。フォークさせて頂きました。https://t.co/yrcx4Gvw9q
— うらがみ (@backpaper0) 2014, 2月 10
こういうことに。
@backpaper0 @t_yano intから文字列を中継しないようにしてみたら速くなりましたー。6桁限定ですが。 https://t.co/9UyUir06Y3
— ふとりんず (@bufferings) 2014, 2月 11
んで、まぁ、なんとなく整形してみて。こうなった。
実行結果は
MBA 1.7 GHz Intel Core i5 で。 Single Thread ==== password=567890 time=221[ms] password=567890 time=204[ms] password=567890 time=202[ms] password=567890 time=210[ms] password=567890 time=196[ms] password=567890 time=205[ms] password=567890 time=203[ms] password=567890 time=208[ms] password=567890 time=190[ms] password=567890 time=201[ms] average time=204[ms] Multi Thread ==== password=567890 time=137[ms] password=567890 time=135[ms] password=567890 time=131[ms] password=567890 time=132[ms] password=567890 time=126[ms] password=567890 time=139[ms] password=567890 time=128[ms] password=567890 time=125[ms] password=567890 time=131[ms] password=567890 time=129[ms] average time=131[ms]
「// 温めておくと速いのだ」の部分はうらろふが教えてくれた。
@bufferings 一回目だけ遅い(というか二回目から速い。正確には一回目の途中から速くなる)のはJITコンパイルが原因のようです。
— うらがみ (@backpaper0) 2014, 2月 11
@bufferings そして-XintオプションでJITコンパイルを無効にすると一回目も二回目以降もだいたい14000msでした。念のため書きますが、これ、桁間違えてません。
— うらがみ (@backpaper0) 2014, 2月 11
@bufferings -XX:PrintCompilation付けると https://t.co/yrcx4Gvw9q みたいになりました。いっぱいコンパイルされてます!✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌
— うらがみ (@backpaper0) 2014, 2月 11
へぇー。理解できてないけど楽しい!