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

あるプログラムをGCCで作成していたのだが、IARで同じコードをコンパイルして実行してみたら18usecで完了していた処理が23usecもかかってしまうようになった。

かってにIARのほうが有償だし、ARM用のコンパイラなのでGCCと比べて効率的にコンパイルしてくれるものだと思っていたので30%ぐらい遅くなっていたので少しびっくりしてしまった。

本当は使ったことがないMDK-ARMも比較しようと思ったのだが、なんか評価用ライセンスが、営業さん経由?じゃないともらえないみたいなのでやめてしまった。

一体GCCとIARのコンパイル後のバイナリの実行速度はどのぐらいになるのか比較していこうと思う。

比較環境

IAR

  • version 9.10.2

GCC

  • gcc-arm-none-eabi-9-2020-q2

まずは三角関数ベンチマークからしてみる。

    start = get_usec();
    for (size_t i = 0; i < buff_size; i++)
    {
        rslt_buff[i] = sinf(m_pi);
    }
    output_elapse("sin", start, buff_size);

1000回しての平均をとってみたら、実行してみたら。

IAR = 0.48usec

GCC = 0.04usec

さすがに何かがおかしい気がしたのでちょっと確認してみる。

引数に渡しているm_piという変数が毎回一緒なのでGCCのほうは最初っからコンパイルずみの数値をrslt_buffに突っ込んでいるのではないか?とおもって、 Sinに渡す引数をRNGをつかって数値を実行時に作って、計算前にバッファにためておいた引数を利用するように変更した。

    start = get_usec();
    for (size_t i = 0; i < buff_size; i++)
    {
        rslt_buff[i] = sinf(ix_buff[i]);
    }
    output_elapse("sin", start, buff_size);

IAR = 0.36usec

GCC = 0.46usec

なぜか、IARのほうがはやくなったしまったが、それっぽい結果になったNanoLibのSinよりもIAR同梱のSinのほうが最適化されているのでは?という当初の予想通りに結果になった。

ちなみにCMSISの高速なSin関数は どちらも 0.33usec だった。

とりあえず、実行環境ができたので、今日はここまで。