
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位、結構ガツンと狂います。
しかもその狂い←●が等間隔で現れるのかと思いきや、そうでもありません。
この一見そろっているようで、時々ガツンと狂うのは何故なんでしょうか?
No.4ベストアンサー
- 回答日時:
> 正確に時間を測るにはどうしたらいいんでしょうか?
> XPです。
Windows上では、正確な時間の保障はありません。
ぶっちゃけ、計測中にゲームのピンボールを開始したら確実にズレます。
ピンボールでなくても、OSや常駐アプリが裏で色々やりますので、そういった影響は避けられません。
厳密に目的を果たすためには、リアルタイムOSのプラットフォームを選択します。
e-Words - リアルタイムOS
http://e-words.jp/w/E383AAE382A2E383ABE382BFE382 …
計測が目的なのであれば、No.2さんのような代案として、試行回数を増やして精度を上げるとかしか無いかと。
No.7
- 回答日時:
もっと根本的なことから説明しないといけないようですね。
あなたは、clock()の精度を計測したつもりのようですがそうではありません。また、「同じ処理なら何回やっても同じ所要時間のはず」と思っておられるようですが、それも違います。
clock()そのものは、PCのクロックの水晶発信機の精度のはずです。ただ、clock()がいつ呼び出されるかが不安定なのです。Windowsかlinuxか、なにで実行されたのか知りませんが、どれもマルチタスクOSですから、あなたのプログラム以外のプログラム(OS自身も含めて)とをとかえひっかえ実行しています。なので、他のプログラムに切り替わるタイミングによっては10msくらい計測値がずれるのは普通です。
まず、経過時間と処理時間とどちらを計りたいのでしょうか?
それによっては、対処法がかわってきます。
No.6
- 回答日時:
殆どことを皆さんが回答していらっしゃるので・・・
それでも精度をすこしでも^^;
TIMECAPS tc
timeGetDevCaps (&tc, sizeof (rc));
timeBeginPeriod (tc.wPeriodMin);
time = timeGetTime ();
timeEndPeriod (tc.wPeriodMin);
clock ()の変わりにtimeGetTime ()を使って(clock()でもいいかな?)
精度を上げることができるかもしれませんね。
詳しくはtimeBeginPeriod などのヘルプ見てくださいね。
No.5
- 回答日時:
ん~, 1/60sec くらいの狂いのように見える....
正確な計測をしたいってことであれば, Windows ならマルチメディア系の時計を使えばいいかもしれないし, TSC レジスタを読み込んでもいいかもしれない. ただし, 「かかった時間が正確にわかる」だけであって「かかる時間が同じになる」わけではない.
No.3
- 回答日時:
同じプログラムでも、毎回実行所要時間は微妙に違います。
時間計測の誤差ではありません。
いずれにせよ、タイムシェアリングOSでのアプリケーションでの時刻計測は、せいぜい 0.1秒程度の制度しか期待できないと思ったほうがいいです。
No.2
- 回答日時:
何がしたいのかによっては代案がありえるかも。
> 正確に時間を測るにはどうしたらいいんでしょうか?
clockの結果はそれなりに正しそうに見えます。
その値は誤差ではなくて、本当にそこにそれだけの時間がかかっててそうなっているのでは?
余分な時間がかかるのに同じ値だったとしたら不正確な時間ということになりますが、
かかった時間が出てるだけなのではないでしょうか。
で「この余分な時間がかからないようにしたい」ということであれば、
本質的にWindowsのアプリでは不可能です。考え方を改める必要があります。
優先度やらもろもろで無理やり近い状態に回避することはできても、
Windowsは非リアルタイムなマルチOSなので、精度の保証をしてません。
例えばメモリがスワップしたとか、ちょっとしたことで簡単に周期が揺らぎますし、
リアルタイムOSとは特性が違うので「そういうもの」です。
なお、Windowsでも計測時間は1ms精度くらいまで計れますが、
1ms周期での正確な計測は不可能です。
例えば、「10msのつもり」で「13msかかった」ことが計測できても、
「必ず10ms時点で計測」ってのはできません。(計測はあくまで13ms時点。どれだけ遅れるかは予測不能)
これが非リアルタイムOSの基本であり、アプリはこの前提で動くように作らなければなりません。
# これがリアルタイムOSだと「最低何ms以内に動作する」とかの保証があります。
そもそも、正確な周期での動作をWindowsアプリに求めては駄目です。
必要精度の1/10以下くらいで計測しつつ自前で調整して我慢するとか、
本当に精度が必要なら専用のリアルタイムOSを使うとか、専用ドライバを書くとかになると思います。
No.1
- 回答日時:
一応、動作環境を特定してください。
お試しの環境が、例えばLinuxとかWindows等のマルチプロセス環境だとすると、おそらくそのタイミングでコンテキストスイッチなどが発生したと思われます。
平たく言うと他のプロセスも同時に走ってるのでそれらと交代する時間とかですね。
「ロスタイム」みたいなものでしょうか。
RTOSと呼ばれる時間保証の厳しい環境でもない限り、PC等のアプリレベルはまぁそんなものです。
この回答への補足
すみません、書きそびれました。
XPです。
コンパイラはVS2003です。
正確に時間を測るにはどうしたらいいんでしょうか?
マイクロ秒の計測はそれ自体で時間とってしまいそうですし・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 3×3のラテン方陣をつくるプログラムを作成したのですが、(↓) #include <stdio.h> 5 2023/07/10 01:53
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
vistaでリアルモード⇔プロテク...
-
Delphiに関して 「このプロ...
-
アクセス[ファイルを開かずに、...
-
sleep関数について
-
パソコンの演算速度について
-
C言語にてwindowsアプリケーシ...
-
ポップアップとホームページの設定
-
コンパイルできません。
-
本当に分からないので教えてく...
-
C++でCtrl+Cを無効化したい
-
SendKeysについて
-
C言語 コマンドラインの文字列...
-
IT未経験で入社しました。 COBO...
-
fortranで長いプログラムを書き...
-
CDからVBSを自動実行させ...
-
C++勉強中(課題にとりかかる前...
-
SQLインジェクションについて
-
機械語ダンプリストについて。
-
W-ZERO3のプログラム実...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
パソコンの演算速度について
-
VB上で実行中の無限ループの止め方
-
sendkeysにてALT+CTRL+INSERTを...
-
C言語で途中までしか、プログラ...
-
VBAで外部プログラムを非表示で...
-
システム資源とは?
-
実行時エラー429
-
終了してもプログラムが実行し...
-
sleep()関数について
-
他の実行ファイルを実行するプ...
-
RPG パラメーターについて
-
UWSCがうまく動かない
-
Windows10でDOSゲーム
-
clock関数は正確じゃないの?
-
C言語でプログラムを再起動
-
Excel VBA から外部プログラム...
-
system関数を使用してsuコマン...
-
プロセス間通信について
-
Borland C++を利用しているので...
おすすめ情報