忙しい現代人の腰&肩のお悩み対策!

clock関数でプログラムの時間を計測しようと思っているのですがうまくいきません。

-----------------------------
clock_t start,end;

start = clock();

(処理)

end = clock();
printf("かかった時間:%f",(double)(end-start)/CLOCKS_PER_SEC);
-----------------------------

上のようにしているのですが、実行結果は0.00000秒と出てしまいます。処理のところは足し算を何題か出題し解答を入力し正解したら次の問題というようなことをしています。
確認のためstartにclock()を代入した後とendに代入したあとでprintfでstartとendを出力してみましたが、どちらの値も10.00000で同じ値となっています。0秒になるのはこれのせいだと思うのですが、どうして同じ値になるのでしょうか?

A 回答 (2件)

>どうして同じ値になるのでしょうか?


(処理)が、clock()値に対して速すぎるからだと思います。

clock()での区間計測は、一般に低精度です。
WinならQueryPerformanceCounter()を使ってみて下さい。それ以外の環境でかつIA32なら、RDTSC命令が有効です。
    • good
    • 0
この回答へのお礼

QueryPerformanceCounter()を使ったらうまくいったのでそちらの方法を使ってみることにします。ありがとうございました。

お礼日時:2005/10/15 15:13

処理系等にも依存しますが、clock関数の分解能に比べて、処理が短すぎることが原因かと思います。



clock_tの精度と実際の分解能は必ずしも一致していません。例えば、clock_tが1msec単位であったとしても、実際の分解能が50msecしかない場合もあるわけです。

分解能の悪さに対する対策としては、同じ処理を1000回とか10000回とか繰り返して、その時間を計測するのが常套手段ですが、繰返しができないようなものや、高い計測精度を必要とする場合は、別の方法を検討するしかありません。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qclock関数は正確じゃないの?

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位、結構ガツンと狂います。
しかもその狂い←●が等間隔で現れるのかと思いきや、そうでもありません。
この一見そろっているようで、時々ガツンと狂うのは何故なんでしょうか?

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;
}

このプログラムの実行結果はこち...続きを読む

Aベストアンサー

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

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

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


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

Qsleep()関数について

"数秒おきに警報をn回鳴らすプログラム"をC言語で作成しようと
考えています。

プログラム実行環境はWindowsですが、
sleep()関数は使用できないのでしょうか??

仮に使用できない場合、この関数に代わる関数や代替方法が
あれば教えて頂けませんでしょうか? 宜しくお願いします。

Aベストアンサー

正確な動作でも構わなければ
windows.hをインクルードして
Sleep()関数を使いましょう.
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200207/02070061.txt

しかし,正確に数秒おきに動作を行いたい場合はマルチメディアタイマ等を使いましょう.
マルチメディアタイマはミリ秒間隔でコールバック関数を呼び出すことができます.
timeSetEventを用いてコールバック関数の登録を行うことができます.
timeKillEventでコールバック関数の解除を行うことができます.

多分他にも方法があると思うのですが…私はこれぐらいしか知りません^^;

参考URL:http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/time.html

Q経過時間を表示させたい(C言語)

今以下のようなプログラムを作っています。問題の部分だけ載せておきます。

 ・
 ・
 ・
a=0;
b=0;
time(&t1);
for(○;△;□){

X番目の素数を表示させるアルゴリズム;

time(&t2);
b=t2-t1;
if(a<b){
a=b;
printf("%d秒経過...\n",a);
}
 ・
 ・
 ・

これですと経過時間は

1秒経過...
2秒経過...
3秒経過...
 ・
 ・
 ・

と表示されるのですが、僕が目指しているのは、例えば、2秒経過したら「2秒経過...」という表示を「1秒経過...」を消してそのところに表示させたいのです。
つまり、まるで秒数の部分だけ変化しているように見せたいのです。
もし、やり方が分かる方がいましたら教えていただけると嬉しいです。ぜひともよろしくお願いします。

Aベストアンサー

すいませんリンク先ちがってました。
http://www.kumei.ne.jp/c_lang/intro/no_59.htm

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Q初級者の質問――time_tについて

私はC言語の初級者です。

time関数というのは現在時刻をtime_t型で返すものですよね。
でも、私はこの意味がよくわかりません。

time_t型とは何でしょうか。

単なる整数なのでしょうか。
確か、time_t型というのは整数で、
1970年1月1日0時からの秒数(世界標準時)だと聞いた気がします。

しかし、(いくつか見てみましたが)大抵のC言語の本では、そういう説明はしていません。
「プログラミング言語C」(カーニハン、リッチー)という本では、
「timeは現在のカレンダー時間を返す。」
と説明しています。
「じゃあ、カレンダー時間って何?」と思いますが、「カレンダー時間」というものの説明は見当たりません。

time_tというのは整数と考えてよいのでしょうか。
time_tで変数宣言すると、プログラムを読む人が「あ、これは時間を表すんだな」とわかり易いから、time_tというものがあるのでしょうか。

それとも、
time_tが秒数を表すかどうかは処理系に依存するのでしょうか。

もし、1970年1月1日からの秒数を表すなら、time関数の戻り値を1年間の秒数で割って1970に足せば今何年かわかるプログラムになりそうですよね。(うるう年や時差は考慮する)
それとも、それは処理系によっては正しく動かないプログラムになるのでしょうか。
(あくまでも考え方です。確か、time_tを渡せば年月日時分秒を返す関数があると思います。)



ちなみに、おとといプログラムを作ってtime関数の戻り値を10進数で表示すると次のようになりました。(VC++)


==============プログラム==============

#include <stdio.h>
#include <time.h>

int main(void)
{
time_t a;
a=time(NULL);
printf("%d\n",a);

return(0);
}

================結果===============

1005300371

私はC言語の初級者です。

time関数というのは現在時刻をtime_t型で返すものですよね。
でも、私はこの意味がよくわかりません。

time_t型とは何でしょうか。

単なる整数なのでしょうか。
確か、time_t型というのは整数で、
1970年1月1日0時からの秒数(世界標準時)だと聞いた気がします。

しかし、(いくつか見てみましたが)大抵のC言語の本では、そういう説明はしていません。
「プログラミング言語C」(カーニハン、リッチー)という本では、
「timeは現在のカレンダー時間を返す。」
と...続きを読む

Aベストアンサー

> C99とは、ISOの規格で比較的新しいものと思います。

そうです。
正式にはISO/IEC 9899:1999です。

> (C98というのは知りませんでした。)
失礼しました。
C89の間違いです。
同様にISO/IEC 9899:1989です。

> しかし、時間の起点が2000年1月1日であっても、秒数でなくて日数であっても、かまわないのでしょうか
時間の起点(というか、時間の管理方法)は time()の管轄であり、型であるtime_tは「time()が返す値を表現できること」が要求されているに過ぎません。
また、「1970年1月1日0時0分0秒からの経過秒数」というのは慣例に過ぎません。

とはいえ、UNIXを起源とする『time_tはlong』と『time()は1970年1月1日0時0分0秒からの経過秒数』という約束事は変えられる事は無いでしょう。
C98/C89との互換性を保ちながら新規格を作ることが予想されるからです(そうでなければlong longなどという型は作らないはず)。
その意味でyoushirさんのおっしゃるとおりだと思います。

> C99とは、ISOの規格で比較的新しいものと思います。

そうです。
正式にはISO/IEC 9899:1999です。

> (C98というのは知りませんでした。)
失礼しました。
C89の間違いです。
同様にISO/IEC 9899:1989です。

> しかし、時間の起点が2000年1月1日であっても、秒数でなくて日数であっても、かまわないのでしょうか
時間の起点(というか、時間の管理方法)は time()の管轄であり、型であるtime_tは「time()が返す値を表現できること」が要求されているに過ぎません。
また、「1970年1月1日0...続きを読む

Qファイル出力で改行を入れたい!

data.txtにファイル出力を行うのですが、gets(c)で入力した一語一語に改行を入れてdata.txtに出力したいのですがどうすればよいでしょうか。
返答のほどよろしくお願いいたします。
include<stdio.h>
#define SIZE 20
void main(void)
{
char c[SIZE], *p;
FILE *fp;

fp = fopen("data.txt","w+");
p = c;
while(gets(c) != NULL){
fputs(p,fp);
}

fclose(fp);
printf("data.txtへ出力しました\n");

}

Aベストアンサー

一語一語ってのは、1回の入力毎って事でしょうか?
とするならば、これでどうでしょうか?

#include <stdio.h>
#define SIZE 20
void main(void)
{
  char c[SIZE], *p;
  FILE *fp;
  
  fp = fopen("data.txt","w+");
  p = c;
  while(gets(c) != NULL){
    fputs(p,fp);
    fputc('\n', fp);
  }
  
  fclose(fp);
  printf("data.txtへ出力しました\n");
  
}

Q複数テキストファイルを読み込み、複数テキストファイルの出力

質問は100個のテキストファイル(それぞれ10個のデータを含む)を読み込み、それぞれのテキストファイルから5個ずつデータを抽出し、200個のテキストファイルとして出力するというプログラムについての質問です。
以下が僕の作ったファイル出力部分のプログラムです。

/************/

void ecg_rr(fp,data_max)

FILE *fp;
{
int b,i=0;
int c=1;
char fname[64];

data[0][i]=trend_data[0][i];

for(i=0;i<100;i++)

sprintf(fname,"ss[%d].txt",1+i);

fp = fopen(fname,"w");
fprintf(fp,"%4d\n",c);
fprintf(fp,"%8.8f\n",data[0][0]);
fprintf(fp,"%8.8f\n",data[0][2]);
fprintf(fp,"%8.8f\n",data[0][4]);
fprintf(fp,"%8.8f\n",data[0][6]);

fclose(fp);

sprintf(fname,"sk[%d].txt",1+i);

fp = fopen(fname,"w");
fprintf(fp,"%4d\n",c);
fprintf(fp,"%8.8f\n",data[0][1]);
fprintf(fp,"%8.8f\n",data[0][3]);
fprintf(fp,"%8.8f\n",data[0][5]);
fprintf(fp,"%8.8f\n",data[0][9]);

fclose(fp);


}

複数ファイルの読み込み方がわからず、自分のプログラムだと1つのテキストファイルしか読み込めないので、16_4.batを作り、その中身を
16_4 読み込むテキストファイル名1.txt ss[1]
16_4 読み込むテキストファイル名1.txt sk[1]

16_4 読み込むテキストファイル名2.txt ss[2]
16_4 読み込むテキストファイル名2.txt sk[2]
・・・
とやったのですが、うまくいきませんでした。
どうすればよいのでしょうか。

質問は100個のテキストファイル(それぞれ10個のデータを含む)を読み込み、それぞれのテキストファイルから5個ずつデータを抽出し、200個のテキストファイルとして出力するというプログラムについての質問です。
以下が僕の作ったファイル出力部分のプログラムです。

/************/

void ecg_rr(fp,data_max)

FILE *fp;
{
int b,i=0;
int c=1;
char fname[64];

data[0][i]=trend_data[0][i];

for(i=0;i<100;i++)

sprintf(fname,"ss[%d].txt",1+i);

...続きを読む

Aベストアンサー

>read_dataの呼び出しは上位レベルのものを直接
>sprintf(fname,,"ss[%d].txt",1+i);
>の後に代入すればよいでしょうか?
私には、上位レベルがどうなっているのかわかりませんので、判断がつきませんが、その前の方がいいと思います。
例:
for(i=0;i<100;i++)

sprintf(fname,"読み込むテキストファイル名%d.txt",i+1);
fp=fopen(fname,"r");
read_data(fp); /* リターン値を使う必要あり? */
fclose(fp);

sprintf(fname,"ss[%d].txt",1+i);

Qエラー:浮動小数点の不正な使用

/*月ごとの平均気温・降水量を構造体の配列に格納した後、 */
/*年間平均気温、年間平均降水量を求めるプログラムを作成せよ。*/

#include<stdio.h>
void main(void)
{
int i;
double total_kion, total_suiryo, av_kion, av_suiryo;
struct YEAR_DATA{
double kion[12];
double suiryo[12];
};

struct YEAR_DATA data[12] = {{3.6, 50},{4.3, 61},{7.5, 98},{13.5, 153},{18.0, 162},{21.7, 210},
{25.6, 218},{26.8, 170},{22.8, 209},{16.9, 121},{11.4, 74},{6.2, 48}};

for(i=0 ; i<12 ; i++){
total_kion += data[i].kion;
total_suiryo += data[i].suiryo;
}

av_kion = total_kion / 12;
av_suiryo = total_suiryo /12;

printf("年間平均気温 %lf\n", av_kion);
printf("年間平均降水量 %lf\n", av_suiryo);
}

構造体のところを勉強しています。
上の問題を解いてみたのですが、for文の中の2行に「浮動小数点の不正な使用」というエラーが起こってしまい、答も違っています。
どこが間違っているのか、ご指摘お願いします。

/*月ごとの平均気温・降水量を構造体の配列に格納した後、 */
/*年間平均気温、年間平均降水量を求めるプログラムを作成せよ。*/

#include<stdio.h>
void main(void)
{
int i;
double total_kion, total_suiryo, av_kion, av_suiryo;
struct YEAR_DATA{
double kion[12];
double suiryo[12];
};

struct YEAR_DATA data[12] = {{3.6, 50},{4.3, 61},{7.5, 98},{13.5, 153},{18.0, 162},{21.7, 210},
{25.6, 218},{26.8, 170},{22.8, 209},{16.9, 121},{11.4, 74...続きを読む

Aベストアンサー

Visual C++ 2003 でコンパイルした結果
誤りは以下
struct YEAR_DATA{
double kion;
double suiryo;
};
total_kion=0.0;
total_suiryo =0.0;
年間平均気温 14.858333
年間平均降水量 131.166667

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Qclock()関数の誤差

プログラムの実行時間の計測について質問させていただきます。
現在,実行時間の計測でclock()関数を使っているのですが誤差が出ます。
timeコマンド(と実際に時計で測った時間)では95分、clock()関数で測った
プログラム全体の実行時間は1376秒(約23分)と誤差が出る状態にあります。
プログラムでclock()関数を使っているのはmain()だけです。
printf()内がおかしいのでしょうか?
詳しい方、回答よろしくおねがいします。

↓プログラム
#include<time.h>
(中略)
clock_t t1,t2,t3,t4;
(中略)

main()
{
struct zahyo P,Q;
int a,b,prime,Ord,sec;

scanf("%d",&a);
(中略)
printf("Q.y = "); scanf("%d",&Q.y);

t1=clock();
Ord=OrdCal(P,a,prime);
t2=clock();
printf("Ord = %d\n",Ord);
printf("OrdCal:%f(s)\n",(double)(t2-t1)/CLOCKS_PER_SEC);
t3=clock();
PohlingBsgs(P,Q,a,prime,Ord);
sec=secretkey();
t4=clock();
printf("secretkey=%d\n",sec);
printf("Decipher:%f(s)\n",(double)(t4-t3)/CLOCKS_PER_SEC);
printf("Total :%f(s)\n",(double)(t4-t1)/CLOCKS_PER_SEC);
}

実行結果
Ordcal:74.170000(s)
Decipher:1302.722704(s)
Total :1376.902104(s)

real 94m33.445s
user 94m30.900s
sys 0m0.980s

プログラムの実行時間の計測について質問させていただきます。
現在,実行時間の計測でclock()関数を使っているのですが誤差が出ます。
timeコマンド(と実際に時計で測った時間)では95分、clock()関数で測った
プログラム全体の実行時間は1376秒(約23分)と誤差が出る状態にあります。
プログラムでclock()関数を使っているのはmain()だけです。
printf()内がおかしいのでしょうか?
詳しい方、回答よろしくおねがいします。

↓プログラム
#include<time.h>
(中略)
clock_t t1,t2,t3,t4;
(中略...続きを読む

Aベストアンサー

> time.hの関数を見たところ時間が測れるもので大きい数に対応している
> ようなものはないように思えます。小刻みに時間を測るのでしょうか?
> 何か良い方法はありますか?よろしかったら教えてください。

例えば、time() 関数と difftime()関数を使用すれば精度が秒ですが、長い時間をはかることができます。
clock()関数を使用するなら、やっぱり小刻みに時間をとっていくのが一番簡単かもしれません。

参考URL:http://www.bohyoh.com/CandCPP/C/Library/time.html,http://www.bohyoh.com/CandCPP/C/Library/difftime.html


人気Q&Aランキング