VBで正確な時間計測をするには,timeGetTime(Windows起動からの経過時間をms単位で返す)を使用するのがよいと聞いたのですが,このtimeGetTimeの返す値自体はどの程度正確なのでしょうか?(あるいは何に依存するのでしょうか?)
宜しくお願いします.
自分でテストするのが一番と思いますし、
Webを探せば計測結果ぐらいすぐ見つかりますが、
誤差はほぼ1msecのはずです。
Win95系の場合、誤差が顕在化する以前にオーバーフローしてシステムが破綻します。
timeGetTimeやGetTickCountを保持するシステム変数はunsign int ですから、
保持できる最大値は 4294967295msec ≒ 49.71日です。
従って、Win95系マシンを50日つけっぱなしにすれば、破綻を確認できます。
ご回答ありがとうございます.
> 誤差が顕在化する以前にオーバーフローしてシステムが破綻します。
ということは,例えばWindowsを起動させて0日にtimeGetTimeで得た値と,
ちょうど49日後の全く同時刻に得たその値では,その差の誤差は1msec
程度(49*24*60*60*1000±1msec)だということなのでしょうか?
最初に書きましたように自分でテストするのが一番と思います。
Web上の情報は基本的に検閲も監修も受けてませんから、
参考程度にするのがよろしいかと・・・。
> 最初に書きましたように自分でテストするのが一番と思います。
たしかにそうですけど、49日くらいもパソコンを付けっぱなし・・・というのは、
普通の人には無理っぽい気が…(^^ゞ
さらにWindows95ですからねぇ、15日以上起動させっぱなしという時点で難しいのでは…?
でも、多分そうだと思います。
どうやら、実際にそういう目にあった人がいたようですから。
リッチテキストボックスで行位置や桁位置を取得するとき、
条件によってはその数値が変に(負数になったり)なったりすることがありますけど、
そんな感じで。
まあ、50日もあったら気にするほどでもないですけど。
さて、じゃあ49日もパソコンを付けずにめちゃめちゃになるのを確認するには、
簡単な方法ですけど、最初からめちゃめちゃになる寸前の数値にしたカウンタ(4294967290とか)を用意して、
それをtimeGettimeの数値と見立ててやってみてはどうでしょう?
用意したカウンタを、1ミリ秒ごとではわからないので、1秒ごとに1加算していきます。
すると、5秒後には、49日たったのと同じような現象がおこると思います。
> このtimeGetTimeの返す値自体はどの程度正確なのでしょうか?
デフォルトでNT系では5ms, 95系では1msの精度です。
http://msdn.microsoft.com/library/en-us/multimed/mmfunc_2q3p.asp
> Win95系の場合、誤差が顕在化する以前にオーバーフローしてシステムが破綻します。
timeGetTimeって,1msのサイクルを数えた数を返すんですか?
私は,システム時計から時刻を得て,
(現時刻 - 起動時刻)
を返しているのかと思っていましたが。
前者なら,時間が経つほど誤差が積み重なりますが,後者であれば経過した時間は誤差に関係しません。
Sayさんは「誤差が顕在化する以前」と書かれているので,前者を前提とした書き方ですよね。
VC++5付属のヘルプとWeb上のMSDN(英語版)のMultimedia Timerのあたりを探してみましたが,どちらであるかの記述は得られませんでした。
#経過時間(the time elapsed)という表記なので,後者を連想したのですけどね……。
ご回答ありがとうございます.
> すると、5秒後には、49日たったのと同じような現象がおこると思います。
いえ,破綻する点よりも,どの程度実際の時間に正確なのかを測定したいの
ですが,その場合はストップウォッチ片手に数日間走らせてみて,
timeGetTimeの値と照らし合わせてみるという感じでテストするしかないの
でしょうか?
最初に言います。
ストップウォッチでの測定は無意味です。
測定するならせめてセシウム原子時計を使ってください。
ちょっとまじめに調べてみました。
カレンダやタイマの基準になる水晶発振子の精度は
せいぜい1ppm程度のようです。
精度1ppmなら約17分に最大1msecずれる計算になります。
時計風に言うと「月差2.6秒以内」ということになります。
通常のクオーツ時計/ストップウオッチの精度はせいぜい「月差15秒以内」ですから
パソコンのほうが精度が高く、ストップウオッチでの精度の測定は不可能です。
セシウム原子時計同期NTPサーバならば、1ppt程度の精度が期待できます。
これは年差32μsec に相当しますので、精度の測定をするなら、
これを使うことになるでしょう。(国立天文台にあります。)
さらなる精度を求めるなら、水素メーザ原子時計が0.1ppq程度の精度(年差3.2nsec)を
持っているようですが、これを用いたNTPサーバの存在を私はしりません。
たとえ存在したとしても、これほどの精度になると、
たとえ光速で信号を送っても距離によるタイムラグや、
重力やその他の加速度による相対論的影響を無視できないでしょう。
パソコンのカレンダやタイマは、NTP同期をしていないかぎり
水晶発振子の精度の影響を受けますから、
精度1ppmなら「月差2.6秒以内」ということになります。
50日では最大4.3秒程度ずれることになります。
(逆にいうと、NTP同期していれば、年差3.2nsecの精度を得られる、ということです。)
ただし、常に1ppmのズレがあり、しかも累積するわけではありませんので、
実際には月差2.6秒より小さくなります。
この誤差は20〜30℃におけるものですから、温度調節されてない場所では逆に、
ズレは月差2.6秒よりもっと大きくなります。
また、マシンによる個体差もありますので、他人の測定結果は
あくまで参考にしかなりません。
以上の事を踏まえると、結局、さまざまな温度条件下で原子時計を用いて
自分のマシンを自分で測定してみるしかない、ということになります。
割り込みで余談すみません<(_)>
電波時計は10万年に一秒の誤差と聞きます。それで測定するも良いのでは?
また電波時計のキットをPCに接続する事もできるようですね・・・・
↓参照
http://www.ne.jp/asahi/ham/js1rsv/aki/kit/jjyrx.htm
割り込みすみませんでした・・・・
なかなかおもしろいものが出てますね。知りませんでした。
でも、いかに精度が高くても接続がRS232Cでは、
転送速度が230kbpsとして、
long型のデータ1つ送るのに139μsecかかっちゃいますね。
それでそんなことを知ってどうするんですかね?
そんなことを言ってるとヴァレンシアのウォーゼルにしかられますよ。(^_^;
「君たち人間は知識を得る喜びを知らなさ過ぎる。」とかなんとか・・・。
知ることそのものに意味があるのです。
な、なるほど。
よく分からないけどなんとなく、なるほど(^^;
皆様,丁寧なご回答ありがとうございました.
私の目的は心理実験の測定に使う程度のものですので,
timeGetTimeで充分なようです,ありがとうございました.
ツイート | ![]() |