アプリ版:「スタンプのみでお礼する」機能のリリースについて

clock関数で時間を計測するとどうも狂ってしまいます。
おかしいので、このようなプログラムでclock関数の精度を調べてみました。

#include <stdio.h>
#include <time.h>
int main(){
    int i,j;
    clock_t start;
    for(i=0;i<50;i++){
        start = clock();
        for(j=0;j<3000000000;j++);
        printf("%4.3f秒\n",(double)(clock()-start)/CLOCKS_PER_SEC);
        }
    return 0;
}

このプログラムの実行結果はこちらです。

1.672秒
1.672秒
1.672秒
1.672秒
1.687秒←●
1.672秒
1.672秒
1.672秒
1.672秒
1.672秒
1.671秒
1.672秒
1.672秒
1.672秒
1.688秒←●
・・(略)

若干1.672で落ち着いているかと思いきや、時々狂っています。
この狂いは何が原因なんでしょうか?
しかも狂うときは0.01位、結構ガツンと狂います。
しかもその狂い←●が等間隔で現れるのかと思いきや、そうでもありません。
この一見そろっているようで、時々ガツンと狂うのは何故なんでしょうか?

A 回答 (7件)

> 正確に時間を測るにはどうしたらいいんでしょうか?


> XPです。

Windows上では、正確な時間の保障はありません。
ぶっちゃけ、計測中にゲームのピンボールを開始したら確実にズレます。
ピンボールでなくても、OSや常駐アプリが裏で色々やりますので、そういった影響は避けられません。
厳密に目的を果たすためには、リアルタイムOSのプラットフォームを選択します。

e-Words - リアルタイムOS
http://e-words.jp/w/E383AAE382A2E383ABE382BFE382 …


計測が目的なのであれば、No.2さんのような代案として、試行回数を増やして精度を上げるとかしか無いかと。
    • good
    • 1

もっと根本的なことから説明しないといけないようですね。


あなたは、clock()の精度を計測したつもりのようですがそうではありません。また、「同じ処理なら何回やっても同じ所要時間のはず」と思っておられるようですが、それも違います。

clock()そのものは、PCのクロックの水晶発信機の精度のはずです。ただ、clock()がいつ呼び出されるかが不安定なのです。Windowsかlinuxか、なにで実行されたのか知りませんが、どれもマルチタスクOSですから、あなたのプログラム以外のプログラム(OS自身も含めて)とをとかえひっかえ実行しています。なので、他のプログラムに切り替わるタイミングによっては10msくらい計測値がずれるのは普通です。

まず、経過時間と処理時間とどちらを計りたいのでしょうか?
それによっては、対処法がかわってきます。
    • good
    • 2

殆どことを皆さんが回答していらっしゃるので・・・


それでも精度をすこしでも^^;

TIMECAPS tc
timeGetDevCaps (&tc, sizeof (rc));

timeBeginPeriod (tc.wPeriodMin);
time = timeGetTime ();
timeEndPeriod (tc.wPeriodMin);

clock ()の変わりにtimeGetTime ()を使って(clock()でもいいかな?)
精度を上げることができるかもしれませんね。
詳しくはtimeBeginPeriod などのヘルプ見てくださいね。
    • good
    • 0

ん~, 1/60sec くらいの狂いのように見える....


正確な計測をしたいってことであれば, Windows ならマルチメディア系の時計を使えばいいかもしれないし, TSC レジスタを読み込んでもいいかもしれない. ただし, 「かかった時間が正確にわかる」だけであって「かかる時間が同じになる」わけではない.
    • good
    • 1

同じプログラムでも、毎回実行所要時間は微妙に違います。


時間計測の誤差ではありません。

いずれにせよ、タイムシェアリングOSでのアプリケーションでの時刻計測は、せいぜい 0.1秒程度の制度しか期待できないと思ったほうがいいです。
    • good
    • 0

何がしたいのかによっては代案がありえるかも。



> 正確に時間を測るにはどうしたらいいんでしょうか?

clockの結果はそれなりに正しそうに見えます。
その値は誤差ではなくて、本当にそこにそれだけの時間がかかっててそうなっているのでは?
余分な時間がかかるのに同じ値だったとしたら不正確な時間ということになりますが、
かかった時間が出てるだけなのではないでしょうか。

で「この余分な時間がかからないようにしたい」ということであれば、
本質的にWindowsのアプリでは不可能です。考え方を改める必要があります。

優先度やらもろもろで無理やり近い状態に回避することはできても、
Windowsは非リアルタイムなマルチOSなので、精度の保証をしてません。
例えばメモリがスワップしたとか、ちょっとしたことで簡単に周期が揺らぎますし、
リアルタイムOSとは特性が違うので「そういうもの」です。

なお、Windowsでも計測時間は1ms精度くらいまで計れますが、
1ms周期での正確な計測は不可能です。
例えば、「10msのつもり」で「13msかかった」ことが計測できても、
「必ず10ms時点で計測」ってのはできません。(計測はあくまで13ms時点。どれだけ遅れるかは予測不能)
これが非リアルタイムOSの基本であり、アプリはこの前提で動くように作らなければなりません。
# これがリアルタイムOSだと「最低何ms以内に動作する」とかの保証があります。

そもそも、正確な周期での動作をWindowsアプリに求めては駄目です。
必要精度の1/10以下くらいで計測しつつ自前で調整して我慢するとか、
本当に精度が必要なら専用のリアルタイムOSを使うとか、専用ドライバを書くとかになると思います。
    • good
    • 0

一応、動作環境を特定してください。




お試しの環境が、例えばLinuxとかWindows等のマルチプロセス環境だとすると、おそらくそのタイミングでコンテキストスイッチなどが発生したと思われます。

平たく言うと他のプロセスも同時に走ってるのでそれらと交代する時間とかですね。
「ロスタイム」みたいなものでしょうか。

RTOSと呼ばれる時間保証の厳しい環境でもない限り、PC等のアプリレベルはまぁそんなものです。

この回答への補足

すみません、書きそびれました。

XPです。
コンパイラはVS2003です。

正確に時間を測るにはどうしたらいいんでしょうか?
マイクロ秒の計測はそれ自体で時間とってしまいそうですし・・。

補足日時:2006/11/29 01:35
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!