chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

Zerynth 版 Pythonのループの速度

ZerynthのPythonVM中間言語で動いていると推測して、ループがどれぐらいの速度か簡単に計測した。
オシロも使って測った方がいいけど、暫定で内蔵タイマーで測ると以下であった。

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()
 


速度のオーダーがあまり変わらないのだけど、、初期設定ではシステムクロックも落とされているかもしれないのでもう少し調査が必要