timeGetTimeの正確さ

解決


Matsu  2003-01-07 04:29:29  No: 105781

VBで正確な時間計測をするには,timeGetTime(Windows起動からの経過時間をms単位で返す)を使用するのがよいと聞いたのですが,このtimeGetTimeの返す値自体はどの程度正確なのでしょうか?(あるいは何に依存するのでしょうか?)
宜しくお願いします.


Say  2003-01-07 05:22:46  No: 105782

自分でテストするのが一番と思いますし、
Webを探せば計測結果ぐらいすぐ見つかりますが、
誤差はほぼ1msecのはずです。

Win95系の場合、誤差が顕在化する以前にオーバーフローしてシステムが破綻します。
timeGetTimeやGetTickCountを保持するシステム変数はunsign int ですから、
保持できる最大値は 4294967295msec ≒ 49.71日です。
従って、Win95系マシンを50日つけっぱなしにすれば、破綻を確認できます。


Matsu  2003-01-07 05:39:40  No: 105783

ご回答ありがとうございます.

> 誤差が顕在化する以前にオーバーフローしてシステムが破綻します。

ということは,例えばWindowsを起動させて0日にtimeGetTimeで得た値と,
ちょうど49日後の全く同時刻に得たその値では,その差の誤差は1msec 
程度(49*24*60*60*1000±1msec)だということなのでしょうか?


Say  2003-01-07 08:24:02  No: 105784

最初に書きましたように自分でテストするのが一番と思います。

Web上の情報は基本的に検閲も監修も受けてませんから、
参考程度にするのがよろしいかと・・・。


たかみちえ  URL  2003-01-07 09:19:27  No: 105785

> 最初に書きましたように自分でテストするのが一番と思います。
  たしかにそうですけど、49日くらいもパソコンを付けっぱなし・・・というのは、
普通の人には無理っぽい気が…(^^ゞ
さらにWindows95ですからねぇ、15日以上起動させっぱなしという時点で難しいのでは…?

  でも、多分そうだと思います。
どうやら、実際にそういう目にあった人がいたようですから。
リッチテキストボックスで行位置や桁位置を取得するとき、
条件によってはその数値が変に(負数になったり)なったりすることがありますけど、
そんな感じで。
まあ、50日もあったら気にするほどでもないですけど。

  さて、じゃあ49日もパソコンを付けずにめちゃめちゃになるのを確認するには、
簡単な方法ですけど、最初からめちゃめちゃになる寸前の数値にしたカウンタ(4294967290とか)を用意して、
それをtimeGettimeの数値と見立ててやってみてはどうでしょう?
  用意したカウンタを、1ミリ秒ごとではわからないので、1秒ごとに1加算していきます。
すると、5秒後には、49日たったのと同じような現象がおこると思います。


YuO  2003-01-07 10:24:30  No: 105786

> この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)という表記なので,後者を連想したのですけどね……。


Matsu  2003-01-07 10:42:22  No: 105787

ご回答ありがとうございます.

> すると、5秒後には、49日たったのと同じような現象がおこると思います。

いえ,破綻する点よりも,どの程度実際の時間に正確なのかを測定したいの
ですが,その場合はストップウォッチ片手に数日間走らせてみて,
timeGetTimeの値と照らし合わせてみるという感じでテストするしかないの
でしょうか?


Say  2003-01-07 19:18:18  No: 105788

最初に言います。
ストップウォッチでの測定は無意味です。
測定するならせめてセシウム原子時計を使ってください。

ちょっとまじめに調べてみました。
カレンダやタイマの基準になる水晶発振子の精度は
せいぜい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秒よりもっと大きくなります。
また、マシンによる個体差もありますので、他人の測定結果は
あくまで参考にしかなりません。

以上の事を踏まえると、結局、さまざまな温度条件下で原子時計を用いて
自分のマシンを自分で測定してみるしかない、ということになります。


ファリンファリン  2003-01-07 19:30:32  No: 105789

割り込みで余談すみません<(_)>
電波時計は10万年に一秒の誤差と聞きます。それで測定するも良いのでは?
また電波時計のキットをPCに接続する事もできるようですね・・・・
↓参照
http://www.ne.jp/asahi/ham/js1rsv/aki/kit/jjyrx.htm

割り込みすみませんでした・・・・


Say  2003-01-07 19:57:36  No: 105790

なかなかおもしろいものが出てますね。知りませんでした。
でも、いかに精度が高くても接続がRS232Cでは、
転送速度が230kbpsとして、
long型のデータ1つ送るのに139μsecかかっちゃいますね。


nanashi  2003-01-07 20:05:31  No: 105791

それでそんなことを知ってどうするんですかね?


Say  2003-01-07 21:42:40  No: 105792

そんなことを言ってるとヴァレンシアのウォーゼルにしかられますよ。(^_^;
「君たち人間は知識を得る喜びを知らなさ過ぎる。」とかなんとか・・・。

知ることそのものに意味があるのです。


nanashi  2003-01-07 23:06:39  No: 105793

な、なるほど。
よく分からないけどなんとなく、なるほど(^^;


Matsu  2003-01-07 23:49:38  No: 105794

皆様,丁寧なご回答ありがとうございました.

私の目的は心理実験の測定に使う程度のものですので,
timeGetTimeで充分なようです,ありがとうございました.


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加