見出し画像

【ESP32】命令の実行速度を計測してみた

今回は、ESP32でよく使用する以下の主要な命令について、1回の処理にかかる時間を測定しました

測定項目


基本演算
• 足し算、引き算、割り算
センサ系の操作
• アナログ値の読み取り(analogRead)
時間操作
• 時間取得(micros)
デジタル入出力
• デジタル書き込み(digitalWrite)
• デジタル読み取り(digitalRead)
メモリ管理
• メモリの割り当てと解放(malloc と free)

これら一般的に使用される操作のパフォーマンスを測定していきます。

測定方法


測定方法は以下の通り。

1. for文で処理を複数回繰り返す
各命令を1000回、2000回、10000回繰り返して実行し、かかった総時間を計測します。

2. 1回あたりの時間を算出
計測した総時間を繰り返し回数で割り、1回あたりの処理時間を算出します。

測定結果


処理内容 時間(µs)
----------------------------------------
足し算(Addition) 0.09 µs
引き算(Subtraction) 0.09 µs
割り算(Division) 0.09 µs
メモリの割り当てと解放(malloc と free) 0.08 µs
時間取得(micros) 0.64 µs
デジタル読み取り(digitalRead) 0.52 µs
デジタル書き込み(digitalWrite) 1.15 µs
アナログ値の読み取り(analogRead) 42.0 µs

表:ESP32の各命令の実行時間一覧
図:各処理の実行時間(analogRead除外)

技術的な解説


ESP32の基本性能

ESP32は、Xtensaデュアルコアまたはシングルコアの32ビットマイクロプロセッサを搭載していて、基本周波数240MHzで動作します。
これは、Arduino Unoの16MHz、Twiliteの8MHzと比較して非常に高速です。高いクロック周波数のおかげで、ESP32は多くの処理を短時間で実行することができます

また、ESP32の1命令あたりの処理ビット数は32ビット(一般的なパソコンは64ビット)。シングルコアで動作している場合でも、16ビット整数の足し算や引き算は1命令で実行可能であり、計算上は理論的に1秒間に約240M回の命令を処理することができます。

各命令の実行時間とその理由

1. 足し算、引き算、割り算

基本的な演算であり、1命令(1クロック)で処理されます。

一方で割り算は少し複雑で、式によっては繰り返し計算を伴うため、わずかに遅くなる場合があります。

2. analogRead

アナログ値を取得する際、ESP32ではADC(アナログデジタルコンバータ)を使用します。GPIOピンから入力されたアナログ信号をデジタル値に変換するため、他の操作と比較して時間がかかります。

3. micros

時間を取得する操作はESP32内蔵の64bitタイマーを参照するだけです。
足し算引き算よりは低速ですが十分高速です

ちなみにmicros関数は、esp_timer_get_time()関数を内部で呼び出しており、これはESP32のシステムタイマーを利用していて、ESP32起動時からの経過時間をマイクロ秒単位でカウントする64ビットの内蔵タイマーを参照しています。これを32ビット(unsigned long型)にキャストするので約71分でオーバーフローします。
ちなみにesp_timer_get_time()関数を直接呼び出すと、さらに長時間の時間を取得できます。

4. digitalWrite / digitalRead

デジタルピンへの書き込み/読み取りは、GPIOレジスタを直接操作するため比較的速いですが、レジスタ操作自体にオーバーヘッドがあるため、比較的遅くなります。

5. malloc と free

メモリ割り当て(malloc)と解放(free)は、ハードウェアの性能とメモリ状態に依存します。ESP32では非常に高速に処理できます。

まとめ


単純な四則演算は0.1μs、I/Oをデジタルで扱う場合は1.0μs程度、アナログ値で取得すると40μsかかるということがわかりました。

特にanalogReadを使用する際には実行時間に注意です。(といっても非常に高速ですが)
ではまた!

いいなと思ったら応援しよう!