C言語関係掲示板

過去ログ

No.1275 マイクロ秒単位で制御できる時間関数(Visual C++)

[戻る] [ホームページ]
No.16906

Visual C++ での時間測定 
投稿者---たいむ(2004/09/24 20:50:50)


はじめまして。いま一定時間間隔で測定を行なうプログラムを作成中
名のですが、Sleep()を使って10msまでは正確に動作できるのですが、
これが1msにはなりません。HPなどでusleep()という関数を知ったの
ですが、これはUnix用らしく、関数がありませんといわれてしまいます。
Windows,Visual C++の環境で、マイクロ秒単位で制御できる時間関数が
あったら教えてください。


No.16907

Re:Visual C++ での時間測定 
投稿者---Sciggepy(2004/09/24 21:11:43)


>Windows,Visual C++の環境で、マイクロ秒単位で制御できる時間関数が
>あったら教えてください。
多分、無理でしょう。Windows上では、他のプログラムも動いていますし、そもそも、PCがそこまで時間に精密に作られているとは思えません。


No.16942

Re:Visual C++ での時間測定 
投稿者---疑問(2004/09/28 18:30:56)


>多分、無理でしょう。Windows上では、他のプログラムも動いていますし、そもそも、PCがそこまで時間に精密に作られているとは思えません。

すみません。あまりPCなどの知識がないのですが、測定するプログラムなどをCで作った場合、PCで測定する以上、精度は期待しないほうがよいということなのでしょうか?
そもそもそれは、Cの問題なのか、PCの問題なのか教えてください。
精度を要求する測定をしたい場合、適した開発ソフトおよびコンピュータなどありましたが教えていただけませんか?


No.16908

Re:Visual C++ での時間測定
投稿者---Ban(2004/09/24 23:44:23)


>Sleep()を使って10msまでは正確に動作できるのですが、
>これが1msにはなりません。HPなどでusleep()という関数を知ったの
>ですが、これはUnix用らしく、関数がありませんといわれてしまいます。
>Windows,Visual C++の環境で、マイクロ秒単位で制御できる時間関数が
>あったら教えてください。

Windows はリアルタイム OS ではないので、この10ms も正確である
保証がありません(これは Unix 等でも大抵一緒です)。
通常はほぼ10ms で動いて見えますが、実際にはちょっと遅れてますし、
「応答なし」のプログラムなんかいた日にはわりと簡単に寝坊します。

で、1ms くらいまでなら、確か精度だけなら timeBeginPeriod &
timeGetTime あたりで出せたと思いますが(環境やOSの種類にもよります)、
当然これも毎回正確である保証はまったくありませんし、
制御は別途考える必要があります。ループで使うのが確実でしょうか。

Windows でアプリがまともに扱い得るのは多分 1ms が最低なので、
更に精度の桁を(無理やり)下げるには、手動でカウンタなり
QueryPerformanceCounterなりで時間になるまでビジーループ
(ずっと空回り)するくらいしかないと思います。
# usleep の実装もたしか単にこんな感じだったと思います。

とはいえ、他アプリに影響があったり逆効果だったりする可能性も
高い諸刃の剣なので、慎重に計測して使うべきです。

基本的にアプリを書いている限り、マイクロ秒どころかミリ秒単位の
制御も保証されないと思ったほうがいいと思います。
どうしてもやりたければ、もっと適した OS を選択するか、
ドライバなりでカーネルモードで動作させるしかないように思います。

自分の優先度を上げると(自分だけは)精度が出やすくはなったりします。


あと、多分意味ないと思いますが、指定できるだけで本当にその精度で
動作しなくて構わないなら(というかまず無理?)、Windows でも
select は TIMEVAL で"マイクロ秒単位の制御"を指定することが
可能だったと思います。
# どこまで精度が出るか試したことはありません。


No.16927

Visual C++ での時間測定 
投稿者---たいむ(2004/09/27 22:57:51)


ありがとうございます。
timeGetTime()などを使うことで、
何とか1msでは制御することができました。
しかし、かなり精度にばらつきがあります。
やはり測定などに使う場合は、ソフトやOS
をかえるべきなのでしょうか・・・?
でも、いちようできたので、アドバイスありがとうございました。


No.16943

Re:Visual C++ での時間測定 
投稿者---Ban(2004/09/28 21:11:45)


高級アセンブラなどと呼ばれるような言語ですし C の問題ではありません。
PC にしても、きょうびのハードならまぁミリ秒以下の精度は出ます。

ただ、それをソフトから活用するのが難しい(コストがかかる)と言うだけで、
PC用の OS は大抵そういう用途に適していないというのが主な原因です。

例えばマルチプロセスで動作すると言うことは、普通に考えて1プロセスの精度を
上げれば他のプロセスに皺寄せが来ると言うことです。
Windows 等では1アプリにそこまでの精度を保証してあげる必要がないので、
一つの精度を挙げるよりも全体が動きやすくなるように作ってあります。
# で、全体の速度はハードのパワーで稼いでます。

アプリケーションがこの上で動く以上、それを上回る精度は期待しても無駄です。



>しかし、かなり精度にばらつきがあります。
>やはり測定などに使う場合は、ソフトやOS
>をかえるべきなのでしょうか・・・?

ソフト(あぷり)では多分どうにもなりません。ハードも精度保証の
あるものが好ましいですが、変えるなら筆頭候補は OS だと思います。

勿論、先に書いたような Windows でもドライバにして、
アプリには許されていない"汚い手段"を使うのも手ですが、
難易度は結構高いです。
とはいえ、以下のような環境が用意できない場合は唯一の
逃げかもしれません。

比較的簡単そうなのは、シングルタスクのOS にすることでしょうか。
(これがお勧めできるかは別として例えばMS-DOSのような動作をするOSです)
理論的にはバラツキはかなり抑制できると思います。(OS の品質にもよります)

*** ここから下は、最適だと思いますが知識がないと敷居が高いとも思います ***

もしマルチタスクで動作して、なおかつばらつきを減らしたいなら、
リアルタイムOS (RTOS) が適していると思います。

計測器の中身の開発などにも使うような OS なので精度はかなりまで
期待できて結果も安定してますが、PC の環境と比べるとそうとう癖があります。

例えば TOPPERS (http://www.toppers.jp) という RTOS なら無償で
Intel 版が入手できますが、動かすだけでもドライバのポーティング位は
必要になるかも....というくらいには面倒だと思います。

# ちなみにこのような開発でも言語は C が主流です。

これが使える程度の知識があるなら、計測の対象にもよりますが
いっそ Linux あたりのブートローダを流用して、OS 無しで
計測プログラムだけ直接ロードして走らせる方が簡単かもしれません。