実行時間の計測

込み入った質問をさせていただきます。

CS+で既存のプロジェクトを流用して新しいプロジェクトを作り、少しだけプログラムを書き加え、CS+のシミュレータ機能で1ループの実行時間を比較した結果、平均実行時間が10us以上差がありました。既存のプロジェクトに比べ、新しいプロジェクトの方が処理が大きくなるはずですが、既存のプロジェクトの方が処理の時間が長かったです。そもそも差が出るといっても10usも差が出ないはずです。

また実際にマイコンに書き込んで時間を計測しましたが(UART通信でPC側に実行時間を返すプログラムを使用している)、こちらでも既存のプロジェクトと新しいプロジェクトとの間に10us以上の差が出ました。

何か考えられる原因はありますか?ビルドツールの設定は両プロジェクト同じであることを確認しています。また新規で加えた処理を抜いて既存の処理の実行時間を計測しても差があります。

  • 1)最初のプロジェクト:平均実行時間T1

    2)最初のプロジェクト+追加処理:平均実行時間T2

    3)上のプロジェクトから追加処理を外す:平均実行時間T3

    T1 + 10us < T2

    T1 + 10us < T3

    となるのがなぜか?ということですよね。ループ内では関数コールをしますか?2)の作業時に追加したコードで元々あった関数の呼び出し方が機械語レベルで変わったことが影響しているかもしれません。アセンブラ表示にして確認してみてはいかがでしょうか?元々処理時間評価を目的の調査でしょうから追加コードというのもどんな風に展開されているのかの確認になって良いと思います。

  • 10usの差異が生じている1ループ処理の中で、(新・旧で同じ)とある関数やマクロを100回以上呼び出していたりはしないでしょうか。

    ソースを変えていない部分の実行速度は変わらない…とも限りません。例え機械語のレベルで同じコードでも、命令が配置されるアドレスが、奇数と偶数で実行時間が微妙に異なる場合があります。(1命令で、10usも差が出ることはないので、何回も実行される命令であれば、偶数・奇数アドレスの配置の相違で実行速度にそれなりの差が出るかもしれない、といったところです。)

  • チョコです

    >例え機械語のレベルで同じコードでも、命令が配置されるアドレスが、奇数と偶数で実行時間が微妙に異なる場合があります。

    tfさん、RL78ではそのようなことはありませんよ。

    Riku Yataさん

    あまりにも漠然とし過ぎているので、きちんとした回答はできません。そもそも、どれくらいの処理の中で平均10μsなのか。「少しだけプログラムを書き加え」とのことですが、どんな処理を追加したのかも不明では、想像する気にもなれませんよ。

    もう少し詳しい情報を公開してください。

    以上

  • マイコン型名が書かれていなかったのに、なんでRL78だと判ったんですか?って思いましたが、

    「RL78 MCU JP」フォーラムですね…

    RL78/G23でちょっと試してみましたが、チョコさまの仰る通り、配置番地の偶数・奇数で実行時間は変わりませんでした。配置番地の話は忘れてください、すみません。

  • チョコです。

    以前聞いた話ですが、RL78の各の命令実行時間はハードウェア マニュアルに記載されているクロック数を単純に加算していけばいいようになっていて、これを実現するために分岐系の命令の実行時間が長くなっているとのことでした。RL78のような組み込みで使うデバイスは、命令の実行時間を加算して時間を測る要求が結構あるとのことでした。

    以上