ZerynthのPythonはVM用中間言語で動いていると推測して、ループがどれぐらいの速度か簡単に計測した。
オシロも使って測った方がいいけど、暫定で内蔵タイマーで測ると以下であった。
speed check 3.084 sec (100000 loop) 0.03084 msec (in 1 loop) 30.84 usec (in 1 loop)
1ループが30.84usec
ESP32のMicroPythonの場合も1ループ数十usecなので同じぐらいだ。。うーむ。。
ご参考にスピードチェックプログラム
(ループ内がNOPだと実体にそぐわないのでダミーコードとしてLチカと変数インクリメントを入れてます)
import rtc import streams import timers COUNT=100000 streams.serial() def speed_check(): print("speed check") pinMode(D10,OUTPUT) t = timers.timer() t.start() print(t.get()) y=0 for x in range(COUNT): y = y + 1 digitalWrite(D10, LOW) #print("LOW") #sleep(1000) digitalWrite(D10, HIGH) #print("HIGH") #sleep(1000) end_time = t.get() print("fin") print(end_time) print("msec") print(end_time/COUNT) print("msec") print(end_time/COUNT*1000) print("usec") while True: speed_check()
変数のインクリメントだけなら、1ループ8.76usec
下記のポーリング想定ループの場合、1ループ:23.95usec
(ピンはプルアップしています)
import rtc import streams import timers COUNT=100000 streams.serial() def speed_check(): print("speed check") pinMode(D10,INPUT) t = timers.timer() t.start() print(t.get()) y=0 for x in range(COUNT): value = digitalRead(D10) if value == 0: print("LOW") else: pass #print("HIGH") #print("LOW") #sleep(1000) #print("HIGH") #sleep(1000) end_time = t.get() print("fin") print(end_time) print("msec") print(end_time/COUNT) print("msec") print(end_time/COUNT*1000) print("usec") while True: speed_check()
速度のオーダーがあまり変わらないのだけど、、初期設定ではシステムクロックも落とされているかもしれないのでもう少し調査が必要