![見出し画像](https://assets.st-note.com/production/uploads/images/169370524/rectangle_large_type_2_be7cf6479276d34833f13b719187fdf0.png?width=1200)
【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
![](https://assets.st-note.com/img/1732110062-fnG3YpbgIQJtRmFyV40PUL8Z.png?width=1200)
![](https://assets.st-note.com/img/1732109479-G1XiF5A3gzJ97cntMOSprh4a.png?width=1200)
技術的な解説
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を使用する際には実行時間に注意です。(といっても非常に高速ですが)
ではまた!