三角関数などの級数計算を行うために、sinf() などの関数を使うのと、あらかじめ計算した値で作っておいたテーブルを参照するのとどちらが速いか? 結構これを考え出すと難しい。
ちょっと考えるだけだとテーブル参照は速そうに思えるのだけど、メモリ参照はそこそこ高価。キャッシュがどれだけ当たるか。それに対して、sinf() 関数の呼び出しが FPU を利用する命令に置き換えられて、メモリ参照以上の速度で計算が完了するなら、関数呼び出しだけで済ませた方がいいのではとも考えられる。
で、FPU について調べると、FPU は FPU で利用するための手続きとレイテンシがそれなりに要求されて、そのクロック数もモノによって異なるっぽい。たぶん一部のマシンでは sinf() の方が速いけど、依然としてメモリ参照の方が速いマシンも十分あるものと思われる。
とりあえずの結論としては、各種ハードの FPU の利用方法やレイテンシの違いについて頭を悩ませるよりは、テーブル参照でほぼ一定の実行効率を得る方が実際的かなと。ただ XNA のように実行対象のハードがある程度明確に想定できるならば、開発効率を考えて関数呼び出しだけを使って十分だと思う。
どちらを否定するのも同程度に早計じゃないかしら。
コメントを書く