表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。
56/61

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 が限度だし。

あとは要らない処理を削って清書するだけ。

評価をするにはログインしてください。
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
このエピソードに感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

↑ページトップへ