STM32G4 GCCとIARのコンパイラによるビルド時間の比較(2)

前回の確認でSin関数の速度を確認してみたが、 今度は重い三角関数でかつよくセンサの処理などで利用するatan2の速度を確認してみたいと思う。

IARの三角関数のライブラリは最適化がよく聞いてそうだ。

では、ライブラリは高速だが、コードからコンパイルしたものはあんまり早くないとかあるかなって思って

github.com

にあったfast_atan2を拝借してfloat版にして実行してみた。

関数は各1000回実行した速度を測定している、※()内部の時間

なぜか、GCCのほうは 最初の500msecのチェックの時間がずれていてsin関数の時間が長くなってしまっている。 ここら辺は何が起こっているのかはわからないが、意図したとおりに動作してくれているIARはうれしい。

IAR : ===
check 500msec : 500851.00usec  (500.85msec)
sin : 0.60usec  (0.60msec)
cmsis sin : 0.40usec  (0.40msec)
        error : 0.000325
atan2 : 0.70usec  (0.70msec)
fast atan2 : 0.39usec  (0.39msec)
        error : 0.003900
GCC : ===
check 500msec : 250854.00usec  (250.85msec)
sin : 25.62usec  (25.62msec)
cmsis sin : 0.39usec  (0.39msec)
        error : 0.000325
atan2 : 1.41usec  (1.41msec)
fast atan2 : 0.40usec  (0.40msec)
        error : 0.003880

仕事で利用しているのだが、IARのatan2fが非常に高速なのには助かっている。 以前も仕事中にatan2f使うと重いかな~、、って思ってベンチマークしたんだが、 atan2f律速じゃないことを確認してそのまま利用することができたのでライブラリの速度は勝手に信頼していた。

どうやら、この実行結果だけを確認するとマイコンのコードを書くのにはIARの環境のほうが優秀な印象を受ける。(結構な値段するしだし当たり前か?)

とするとある条件でなぜGCCのほうが高速なプログラムを生成できたのか次に調べてみよう。

確認したプログラムは下記のとおり

github.com