6. micropythonの関数呼び出しとクラス変数アクセスは遅い
ロジアナでクロック観測しつつ、関数内で時刻取得して処理時間を細かく見ていったところ衝撃の結果。
初回のDMAの前処理に644us で DMAに 351us 。
さすがにおかしいでしょ?
と思い、何度か繰り返すと、平均的に前処理 360us, DMA 330us ぐらい。
それでも効率が低すぎる。
もしかしてPSRAMへのコマンド送信やダミーリード処理を関数にしてるせい?と思って、直接 PIO を叩くように変更してみると、DMA前処理が 215us と大幅減少。
やってることは関数呼び出してるだけだったのに??
色々試して結果としてわかったのは、関数を一回呼び出すだけで 10us 近く必要なので、高速な処理では影響が大きいこと。
また、PIOを操作する処理を関数する際、使う情報をクラス変数に保存していたが、クラス変数にアクセスする際pythonの辞書テーブル検索をするのも遅い原因。
関数頭でクラス変数をローカル変数に代入し、関数にした処理をベタ書きした結果、100kByteの読み書き処理の性能。
改善前
write time:182ms, 549.45056kByte/s
read time:195ms, 512.8205kByte/s
改善後
write time:77ms, 1298.7013kByte/s
read time:78ms, 1282.0513kByte/s
大幅に改善した。しかし、実に美しくない。
Cで書き直せばキレイで速くなるだろうけど、まぁこれで妥協かな。
安定して使える CLK5MHz のQSPI転送は 2500kByte/s が限度だし。
あとは要らない処理を削って清書するだけ。




