三角関数速度比較

ゲーム作成ではよく、Sin/Cos関数はセットで頻繁に使うわけですが、
前のエントリーで紹介したC++プログラミング日記様のとこに、参照テーブルによるサイン・コサインの高速化と、FPU命令によるサインとコサインの同時取得の2エントリーがありまして、んじゃどっちが速いのよ?っということで比較してみることにした。
上記2つに加えて、標準(CRT)のsin/cosとSeleneから拝借してきたFastSin/FastCosも比較対象に入れてみます。
なんとなくSSE2有りと無しでも比較してみました。


環境:
Core2Duo E6600(2.2GHz) / WinXP Home / VC++2010EE
単純ループ(10,000 * 10,000)で測定
標準sin/cos及びFastSin/FastCosは同時に取得する関数が無いので、それぞれ呼び出す。

sin/cos SSEなし SSE2有効
CRT 4,110 6,917
FPU命令 5,464 5,262
sincosFast 1,263 678
Selene 428 189

sincosFastってのが参照テーブルによるサイン・コサインの高速化に書かれてた関数で、FPU命令がFPU命令によるサインとコサインの同時取得の関数ですが
・・・えっと。

まずFPU使用したのがあんま早くないですね・・・SSEなしだとCRTのが速いし。
なにかコンパイルオプションか測定方法間違えてるかなぁ・・・

SeleneのFastSin/FastCosがダントツに速いですね。
まぁ、Seleneのは単純にテーブル参照するだけなのに対して、sincosFastのほうは線形補間で精度上げてる分処理時間掛かるのは当然っちゃ当然。

ではその精度はどの程度違うのか、軽く見てみました。

CRTのsinを基準として、sinFastとFastSinでどの程度誤差があるか見てみます。
角度を0.01ずつ増やしながら、CRTとの差の絶対値を加算して平均を取りました。

結果ですが、
sinFastの誤差は0.000032
FastSinの誤差は0.00488
精度はsinFastのほうが格段に良いです。


速度はSelene > sincosFast
精度はsincosFast >> Selene
って結果になりました。

2Dのゲームでは0.001単位の誤差がゲームに大きな影響与える事ってあまりないと思うけど、3Dだとどうなんだろう。
3Dで0.001単位の誤差の影響が無視出来ないレベルなら、sincosFastを使ったほうがいいんだろうね。

Seleneと比較してのsincosFastのメリットは精度の他にもう一つあって、テーブルに使うメモリが1/8で済むんですよ。
Seleneのは4096*sizeof(float)バイトのテーブルなので16kバイト。
sincosFastは256*2*sizeof(float)バイトのテーブルなので2kバイトで済みます。

PC用ならあまり気にするほどの差じゃないけどね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

認証のために問題を解いて下さい * Time limit is exhausted. Please reload CAPTCHA.