毎度のことながら、浮動小数点数演算の速度を測定しました。Mbed Studioというか、ARM Compilerをmbedで使った場合の速度ということになります。
GPIO
GPIOをH/Lさせてオシロで拾って演算速度を測定するので、まずはGPIO単体をH/Lさせるのにかかる時間を測定しました。
ターゲットボード: Nucleo-F446RE
Mbed Studio: 0.5.3
mbed-os: 5.12.0
<ソースコード>
#include "mbed.h"
DigitalOut CheckPin1(D2);
// main() runs in its own thread in the OS
int main()
{
while (true) {
CheckPin1 = 1;
CheckPin1 = 0;
}
}
Mbed Studioには、Build profileに「Debug」「Develop」「Release」があります。それぞれのprofileでBuildして測定しました。
Debug
周期: 361.0ns
Develop
周期: 61.17ns
Release
周期: 61.08ns
mbed-cliの場合は、61.09nsだったので(参考「
GPIO出力の速度比較 mbed OS5 vs HAL API vs LL API」)、profileが「Release」「Develop」の場合はほとんど同じです。「Debug」の場合は遅くなっています。Debug用の割り込みがかかってるんでしょう。
浮動小数点数演算
<ソースコード>
#include "mbed.h"
#include <cstdio>
#include <cmath>
#define PI_F (3.14159265f)
#define LOOP_N (1000)
DigitalOut CheckPin1(D2);
volatile float buffer[LOOP_N];
// main() runs in its own thread in the OS
int main()
{
while (true) {
CheckPin1 = 1;
volatile float fv = 0.0f;
for (int i = 0; i < LOOP_N; i++) {
fv += 0.001f;
//buffer[i] = fv + PI_F; // Add
//buffer[i] = fv - PI_F; // Sub
//buffer[i] = fv * PI_F; // Mul
//buffer[i] = fv / PI_F; // Div
//buffer[i] = sinf(fv);
//buffer[i] = cosf(fv);
//buffer[i] = tanf(fv);
//buffer[i] = expf(fv);
//buffer[i] = logf(fv);
//buffer[i] = powf(2.0f, fv);
}
CheckPin1 = 0;
}
}
1000回ループさせて処理時間を測定しました。
#include <cstdio>
#include <cmath>
は、
#include <stdio.h>
#include <math.h>
とするとアラートが出たので変更しています。
コメントアウトしてある部分を、一つずつコメントアウトしたり外したりして再Buildして測定しました。
測定データ(us)
- |
mbed-cli |
Mbed Studio |
差 |
差2 |
no-op |
39 |
55.9 |
16.9 |
|
add |
77.8 |
94.75 |
16.95 |
0.05 |
sub |
77.8 |
94.625 |
16.825 |
-0.075 |
mul |
77.8 |
94.75 |
16.95 |
0.05 |
div |
145 |
167 |
22 |
5.1 |
sinf() |
569 |
448 |
-121 |
-137.9 |
cosf() |
621 |
415 |
-206 |
-222.9 |
tanf() |
986 |
555 |
-431 |
-447.9 |
expf() |
958 |
645 |
-313 |
-329.9 |
logf() |
946 |
573 |
-373 |
-389.9 |
powf() |
2625 |
2010 |
-615 |
-631.9 |
no-opは演算をすべてコメントアウトした場合の処理時間です。
四則演算ではmbed-cliの方が速くて残念な感じですが、算術関数はMbed Studioの方がかなり速くなっています。
測定データの「差2」はループ固有の処理時間の差を考慮したMbed Studioとmbed-cli処理時間の差です。no-op分を差し引くと四則演算でも引き分けに近い結果です。
メモ
Mbed Studioではbare metal profileというのがあって、RTOSなしで動作するようです。速度はどうだかわかりませんが、サイズはコンパクトになるはず。
「Using the Mbed OS bare metal profile in Mbed Studio」
https://os.mbed.com/docs/mbed-studio/0.5/using-mbed-studio/using-the-mbed-os-bare-metal-profile.html