タイトルが大雑把で申し訳ございません(^^;
今回はタイトルの通り、実行速度で悩んでおります。
使用言語:C
コンパイラ:VisalStudio2008
今回は2次元空間での正規乱数をボックス・ミュラー法を用いて求め、
・任意個の擬似乱数値をファイルに保存しておいて、使用の際に読み込んでいく
・使用する際に毎回計算する
で悩んでおります。
ボックス・ミュラー法による計算式をCで記述すると以下のような感じです。
u1, u2が一様乱数、それをボックス・ミュラー法によりz1,z2の正規乱数に変換しています。
u1 = (double)rand()/RAND_MAX; while( u1 == 0.0 ){ u1 = (double)rand()/RAND_MAX; } u2 = (double)rand()/RAND_MAX; z1 = sqrt(-2.0*log(u1)) * cos(2.0*PI*u2); z2 = sqrt(-2.0*log(u1)) * sin(2.0*PI*u2);式を書きましたがこの式は質問に今回はほぼ関係ないです(^^;
どれくらいの式の量かということで書きました。
次に、上記の式に基づいて2つの実装法の実行速度を示します。(乱数のデータ数は100万個)
ファイルから読み込み使用→0.484(sec)
その場で計算して使用 →0.251(sec)
倍近く違います。
・ファイルへの乱数値の保存は事前にしているため、計算時間には含まれません。
・上では値を使用すると書きましたが、今回の論点は別なので使用の部分は何も操作は行っておりません。(つまり、これも計算時間に含まれない)
補足として、ファイルからの読み込みには1行に1組の二次元データを記述しているため、
fgets()でバッファに1行読み込み、sscanf()でバッファから取り出しています。
------------------
今回は乱数をゲームでのフェードインの模様に使用することを目的としてこのようなことを考えました。
何度も利用する値なのでファイルに保存してた方が良いのかな?と思ったのですが、上記の結果を見るとそうでは無いようです。
<質問1>
このような時間の違いがどこで生まれているかわかりません。
sscanfやfgetsが時間を余分に消費しているのでしょうか。
<質問2>
このような問題の場合、計算結果をファイルに保存して使用するとしたらどれくらいの計算量からならばファイル保存の方がメリットが出るのでしょうか。
それとも、何度も同じ計算結果を利用するにしてもファイルに保存しておいて使用するということは止めた方が良いのでしょうか?
