いやこんな時間に何やってんだよと思われるかもしれませんが、居ても立ってもいられなかったので。
先ほど、うふふさんに尋ねられていた「4,632,097までの素数の個数」について、指定した数までの素数の個数を求めるスクリプトを作っていたんですよ。
最初はPerlで作っていたんですよ。Perlのバッチは手軽に作れて手軽に実行できるから、割と重宝しています。
ロジックとしては単純で、指定された数までループを繰り返して、それまでに出現した素数で割り切れるかどうかを確認する、というものです。
これは後になればなるほど飛躍的に計算量が上昇するのですが、計算のステップを2ずつにしたり、割り切れるか判定する素数を対象の数の半分(本当は平方根が良かったんですが、Perlでの平方根の求め方が分からなかったので)までにするなど、ループ回数を少なくする工夫をしました。
しかし、これだけやったにも関わらず、Perlでは30分以上かけても計算を完了することが出来ませんでした。
そこで、以前検証してPerlよりもメモリを使用する代わりに計算速度の速いということが分かっているJavaで組みなおしてみました。JavaではMathクラスを使うことで平方根が簡単に求められるので、そこの改善も込めました。
すると、Perlで30分かけて終わらなかった計算が、ほんの数秒で完了してしまいました。
以前PerlとJavaで速度検証をしたときにも思ったことですが、Javaの計算速度は半端ないです。
Cの方がさらに早い計算速度になるとは思われますが、Javaほど手軽にバッチを作れないので、手間と計算速度の釣り合いが取れているのはJavaだということが出来ます。
速度を改善したいというなら、Javaに手を出すのも手段の一つのようです。
あまりにも劇的に違いが出たため、興奮してつい日記に記してしまいました。
ちなみに、「4,632,097までの素数の個数」は324,538個でした。
+追記+
デスクトップでPerlのロジックをJavaと同様の改善を施して速度比較を行ったところ、Perlでは40秒、Javaでは535ミリ秒の実行時間がかかりました。差が出過ぎだろ常考。
あとオラクルJDKのダウンロードにアカウント登録が必要とか改悪勧めるのマジでやめてほしい。そこまでして自社製品を売りたいかと軽くなく引く。
最近のコメント