周期の作り方はnanosleepによるウェイトを利用したものと、setitimerによるシグナルを使ったもの。JDS上でxmmsを実行している、というかなりラフな負荷状態で、10/15/17/20msの周期処理を1000回繰り返した結果が以下の表(単位はすべてms)。
nanosleep
周期(=目標値) | 平均 | 標準偏差 | 最小 | 最大 |
10 | 15.4782 | 4.91366 | 10.002 | 20.8937 |
15 | 20.0454 | 1.21523 | 15.4322 | 56.6567 |
17 | 20.013 | 0.303867 | 18.8926 | 26.6976 |
20 | 28.4769 | 3.5365 | 20.0017 | 33.5873 |
itimer
周期(=目標値) | 平均 | 標準偏差 | 最小 | 最大 |
10 | 10 | 0.695859 | 6.40657 | 13.4345 |
15 | 15.0299 | 5.01306 | 6.96788 | 32.863 |
17 | 17.0228 | 4.80681 | 6.43815 | 32.7525 |
20 | 20 | 1.25318 | 7.29573 | 32.7424 |
統計からは見えてこないけど、いずれの測定でもスレッドの起床周期はタイマ割り込み周期である10msに丸められているようだ。ただ、setitimerの測定平均値が狙い値に近いことをみてもわかるように、この丸めは累積しないようになっている。
まあ、普通はsetitimerでいいのかなあ… ただ、タイマ割り込み周期の倍数にならない周期を使いたい場合は適不適が分かれそう。1/30sごとの処理とかしたいんだけどなあ…
0 件のコメント:
コメントを投稿