私は Python の標準ライブラリの time.sleep 関数をいじっていましたが、サブミリ秒の遅延には不十分であることがわかりました。テストの結果、実際には 1 ミリ秒の待機で 1.1 ~ 1.2 ミリ秒待機することがわかりました。ビジーウェイトを実装すると、精度が 1% 以内になりました。私が使用した:
def busy_wait(dt):
current_time = time.time()
while (time.time() < current_time+dt):
pass
1% の精度を破る前に 0.0001 秒まで下がる可能性があります。
主な質問は次のとおりです。
- なぜ sleep 関数はそれほど不正確なのですか (おそらく C の問題)? より高いクロック速度でより優れた CPU を入手すると、これは変わりますか?
- なぜ誰もが睡眠を使うのでしょうか? 私が見る唯一の利点、省電力は、組み込みシステムに限られていますよね?
- キャリブレーションで睡眠の不正確さを補うことは実行可能でしょうか? そのようです:
デフォルトスリープ (dt): スリープ (キャリブレーション関数 (dt))
余談ですが、待機時間が長いとスリープがうまく機能しないことを読みました: Python time.sleep() の上限? SO のどこかで、精度を上げるために短い時間間隔のループを作成することも読みましたが、0.01 秒遅らせたい場合は役に立ちません。Karl Voigtlandは ctypes の nanosleep の使用について言及していますが、これはやり過ぎであり、time.sleep は意図した動作を行うべきだと思います。
time.sleep は壊れた python 機能ですか? それとも、正確な時間測定について十分に気にかけている人はいませんか?