誤差と計算速度
Javaのココロの中に,誤差の話が出てきたので処理系によって差が出るのかなぁ
と思って,いろんな言語で実装してみた.
書いたのはこんなコード
#include <stdio.h> int main(void){ int i; double d = 0; for(i = 0; i < 100000000; i++) d += 0.01; printf("%lf\n", d); return 0; }
これをC, Java, Perl, Rubyで実装.
どれくらい誤差が出るのか,また実行速度はどれくらいなのか比較してみた
# C 1000000.000779 0.797u 0.000s 0:00.79 100.0% 5+177k 0+0io 0pf+0w # Java 1000000.0007792843 1.045u 0.333s 0:02.06 66.5% 82+1317k 41+4io 397pf+0w # Perl 1000000.00077928 10.938u 0.000s 0:10.96 99.7% 1072+528k 1+0io 0pf+0w # Ruby 1000000.00077928 46.000u 0.000s 0:46.08 99.8% 5+703k 0+0io 0pf+0w # Python 1000000.00078 47.414u 0.007s 0:47.51 99.7% 884+1853k 0+0io 0pf+0w
Ruby遅っ!がんがんループを回す者としては,これは頂けません.Pythonも遅い.ループの書き方が悪いのかな?
おそらくPerlが速いのでしょう.Perlistとしては少し安心.
逆にPerlが速いのかな?あとでPythonやPHPも試してみよう.
(2007-07-23 python追加済)
気になるのはJavaのページフォルトの多さ.
実行速度の差はここに原因があるのではないかと思います.
誤差に違いがあるということはわかったのだけれど,その原因までは踏み込めず.
1億回もループを回すとこれだけ実行速度が変わってくるんだなぁ,としんみり.
1億といってもo(N^2)のアルゴリズムだったらN=10000, o(N^3)だったらN=461なので,この差は推して知るべしですな.