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
0 件のコメント:
コメントを投稿