• ベストアンサー

処理時間計測 Part2

http://oshiete1.goo.ne.jp/qa3620415.html で以前に質問したのですが、 #include <sys/timeb.h> struct _timeb tb; double gettimeofday_msec() { _ftime( &tb ); return ((double)tb.time * 1000.0) + ((double)tb.millitm); } ってVisual Studioでも使用可能なのでしょうか? よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

lovelaceさん 補足です。Situgyosyaさんと同じで、問題なくできました。僕の環境は、   - Microsoft Visual Studio .NET 2003   - Microsoft Development Environment 2003 Version 7.1.3091   - Microsoft Visual C++ .NET *****-***-********-***** です。サンプルコードと出力結果をおきますので参考にしてみてください。 ---------- sample.c ここから ---------- 01: #include<stdio.h> 02: #include<sys/timeb.h> 03: 04: struct _timeb tb; 05: 06: double gettimeofday_msec() { 07:   _ftime( &tb ); 08:   return( (double)(tb.time * 1000.0) + (double)tb.millitm ) ; 09: } 10: 11: void some_function() { 12:   volatile int wait = 1000; 13:   while(wait--) printf("%d\n",wait); 14: } 15: 16: main() { 17:   double t1, t2, t3; 18: 19:   t1 = gettimeofday_msec(); 20:   some_function(); 21:   t2 = gettimeofday_msec(); 22:   t3 = t2-t1; 23: 24:   printf( "%f - %f = %f\n", t2, t1, t3 ); 25: } ---------- sample.c ここまで ---------- ---------- stdout出力 ここから ---------- C:\>sample.exe 999 998 997   (中略) 2 1 0 1201237387541.000000 - 1201237387526.000000 = 15.000000 ---------- stdout出力 ここまで ---------- lovelaceさん wrote: > ってVisual Studioでも使用可能なのでしょうか? 実証できたので、結論として可能のようです。 どですか? ~~~~~ 蛇足ながら ~~~~~ 古い本ですので、現在も通用するかどうかわかりませんが、「MicrosoftC/C++ランタイムライブラリリファレンスVersion7」によると、_ftimeはANSIに準拠していないとあります。もしかしたら、Microsoft環境「でだけ」使用可能なのかもしれません。明言は避けます。 ちなみに、上記のコードは、RedhatLinux/Gcc3.4.6環境においてコンパイルエラーをはきます。_ftimeと_timebの先頭のアンダースコアを削除すると問題なくコンパイルでき結果もそれなりのものが得られました。 同じ質問を2度してるようですが、前の質問にも親切に回答してくださってる方がおられます。僕の返事もredfox63さんと同じです。たぶんだけど、そちらにまず返答やお礼などをするなりして、新しく質問してみたらいいんじゃないかなぁ。そんなことはちゃんとしてるよ!だったらごめんね。新参者なのに、意見してすいません(大汗)。ではでは(^^  Magna

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

補足の補足。 > _ftimeはANSIに準拠していないとあります。もしかしたら、Microsoft環境「でだけ」使用可能なのかもしれません。 「_ftime」はたぶんそうです(ひょっとしたらほかのWindows用のCコンパイラの ライブラリにあるかもしれません)。 それは、 Manpage of FTIME http://www.linux.or.jp/JM/html/LDP_man-pages/man3/ftime.3.html の説明を見るとわかりますが、もともとこの関数(ftime)は >4.2BSD, POSIX.1-2001. という環境/規格で決められたものです。 これはCの規格とは別物なので、ANSI(つか今は上のISOなんですけどね) にはないという表現がされているのでしょう。 また、ANSIにない関数ということで _ が前置されていると。 Red Hat+gccで _ 抜きの名前でコンパイルできるのは、GNU/LinuxのCライブラリは 基本的には上記のPOSIXというガイドラインにしたがっているからです。

回答No.1

可能です。やってみればすぐわかることですが。

関連するQ&A

  • 処理時間計測

    処理時間計測用関数を #include <sys/timeb.h> struct _timeb tb; double gettimeofday_msec() { _ftime( &tb ); return ((double)tb.time * 1000.0) + ((double)tb.millitm); } と定義したのですが、これをどのように使えばいいのでしょうか? 教えてください。

  • UNIX times関数を用いた時間計測

    以下のようなforkを使用したプログラムの実行時間を計測したいのですが、times関数の使用方法がわかりません。 gettimeofdayを用いて物理的な実行時間を計測することは出来たのですが、 それでは不充分なので、もっと詳細に計測したいのです。 times関数を用いると ・実行中のプロセスが消費したユーザCPU時間 ・実行中のプロセスが消費したシステムCPU時間 ・子プロセスが消費したユーザCPU時間 ・子プロセスが消費したシステムCPU時間 がわかりますよね?sysconf()でクロック時間を得るところまでは出来たのですが、アドバイスお願いします。 #include <stdio.h> #include <sys/time.h> #include <sys/times.h> #include <unistd.h> int main(int argc, char *argv[]) { int val ; struct timeval tv,tw; gettimeofday(&tv,NULL); time = times(&t); switch(fork()) { case 0: exit(0) ; case -1: perror("child process") ; break; default: wait(&val) ; } gettimeofday(&tw,NULL); time = tw.tv_usec - tv.tv_usec; printf("child PID = %d\n",cpid); printf("val = %d\n"); printf("%ldus\n",time); }

  • sys/time.hのインクルードができない

    プログラムの処理時間をマイクロ単位で計算したいので,gettimeofday関数を使いたいんですが,<sys/time.h>をインクルードするときに以下のエラー文が出力されてコンパイルできずに困っています. /usr/include/sys/time.h:57: error: redefinition of `struct timezone' /usr/include/sys/time.h:94: error: ハクヒ。・ィ・鬘シ before numeric constant /usr/include/sys/time.h:108: error: redefinition of `struct itimerval' 対処の仕方を教えていただけないでしょうか. よろしくお願いします.

  • openMPにしたいのですが

    #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #include "dSFMT.h" #include <sys/time.h> #include <omp.h> #define T_END 100 #define BIRTH_RATE 1.0 #define DEATH_RATE 0.1 #define ALLEE_EFFECT 0.5 #define T_DENSITY 10.0 #define PROPAGULE_SIZE 5 #define SD_INTERACTION 1.0 #define SD_DISPERSAL 1.0 struct timeval start_timeval,end_timeval; int getutimer (struct timeval *start,struct timeval *end) { return ( ((int)end->tv_sec - (int)start->tv_sec)*1000000+((int)end->tv_usec - (int)start->tv_usec) ); } /* Properties of an individual */ typedef struct individual { double x, y, local_density; struct individual *next_indiv; }INDIVIDUAL; void calc_local_density(INDIVIDUAL *); double birth_rate(double); double death_rate(double); void birth(INDIVIDUAL*); void death(INDIVIDUAL*); void dispersal(INDIVIDUAL*); void display_list(INDIVIDUAL*); void write_to_file(INDIVIDUAL*, int, double, double); INDIVIDUAL *make_new_indiv(); INDIVIDUAL *add_next_indiv(INDIVIDUAL*); double weight(double); double distance(INDIVIDUAL*, INDIVIDUAL*); double sqr(double); int number_of_indivs(INDIVIDUAL*, double*, double*); dsfmt_t dsfmt; FILE *fp; int main(){ int seed; INDIVIDUAL *list_head, *indiv; int i, t; double xcenter, ycenter; gettimeofday(&start_timeval,NULL); seed=(long)time(NULL); dsfmt_init_gen_rand(&dsfmt, seed); fp = fopen("output.dat","w"); list_head = make_new_indiv(); indiv = list_head; for(i=0; i<PROPAGULE_SIZE; i++){ indiv = add_next_indiv(indiv); indiv->x = 0.0; indiv->y = 0.0; indiv->local_density = 0.0; } write_to_file(list_head, 0, 0.0, 0.0); for(t = 1; t <= T_END; t++){ dispersal(list_head); death(list_head); calc_local_density(list_head); birth(list_head); printf("Time = %d, Population size =%d\n", t, number_of_indivs(list_head, &xcenter, &ycenter)); write_to_file(list_head, t, xcenter, ycenter); } time(&time2); gettimeofday(&end_timeval,NULL); printf("%d %d, %d\n", time1, time2, time2 - time1); //?? printf("マイクロ秒:%d \n",getutimer(&start_timeval, &end_timeval)); return 0; } ・ ・ ・ ・ int number_of_indivs(INDIVIDUAL *list_head, double *xcenter, double *ycenter){ int count = 0; double xsum = 0.0, ysum = 0.0; INDIVIDUAL *indiv; for(indiv = list_head->next_indiv; indiv != NULL; indiv = indiv->next_indiv){ xsum += indiv->x; ysum += indiv->y; count++; } *xcenter = xsum/(double)count; *ycenter = ysum/(double)count; return count; } をopenMpにしたいのですがなかなか上手くいきません。 人口のシミュレーションなのですが、人が増えるたびに計算回数が増えるのでなんとかしたいのですが・・・ すべてのソースコードを記載ようとしたのですが、文字制限で載せられませんでした・・・ どうかお助けください。。 よろしくお願いいたします。

  • このプログラムについて。

    #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #include <string.h> #define NVALUE 30 #define MAXSIZE NVALUE struct City{ float x; float y; }; struct Country{ struct City cities[MAXSIZE]; int size; }; struct Itine{ float quality; int route[MAXSIZE]; int noc; }; float plength(struct Itine *tour,struct Country *pcountry) { int i,j; double dy; double dx; float length=0.0; for(i=0;i<tour->noc;i++){ j=i+1; if(j==tour->noc) j=0; struct City &c1=pcountry->cities[tour->route[i]-1]; struct City &c2=pcountry->cities[tour->route[j]-1]; double dx = c1.x-c2.x; double dy = c1.y-c2.y; length+=(float)sqrt(dx*dx+dy*dy); } return length; } なんか間違っていますか? エラーメッセージは、この部分 struct City &c1=pcountry->cities[tour->route[i]-1]; struct City &c2=pcountry->cities[tour->route[j]-1]; double dx = c1.x-c2.x; double dy = c1.y-c2.y; が、 ';'が'型'の前にありません と出ています。Visual Express 2005です。

  • 'strcpy': 識別子が見つかりません

    またもやわからないことが・・・ Visual C++ 2005で以下は(一部なんですが)をコンパイルすると、 #include<stdio.h> #include<stdlib.h> FILE *fp; struct meibo{ char name[12]; double tokutenA[6]; double tokutenB[6]; }; void main(int argc,char *argv[]) { char fname[20]; printf("ファイル名\n"); scanf("%s",fname); strcpy(fname,argv[1]); void input(FILE *fp,struct meibo* a,int* end); struct meibo a[5]; FILE *fp; int ban,end; if((fp=fopen("d:\\test\\fname","w"))==NULL){ printf("開けません\n"); exit(1); } visual studio 2005\projects\meibo\meibo1.cpp(18) : error C3861: 'strcpy': 識別子が見つかりませんでした となります、どう言うことでしょうか。 よろしくお願いします。

  • 'strcpy': 識別子が見つかりません

    初心者でまたもやわからないことが・・・ Visual C++ 2005で以下は(一部なんですが)をコンパイルすると、 #include<stdio.h> #include<stdlib.h> FILE *fp; struct meibo{ char name[12]; double tokutenA[6]; double tokutenB[6]; }; void main(int argc,char *argv[]) { char fname[20]; printf("ファイル名\n"); scanf("%s",fname); strcpy(fname,argv[1]); void input(FILE *fp,struct meibo* a,int* end); struct meibo a[5]; FILE *fp; int ban,end; if((fp=fopen("d:\\test\\fname","w"))==NULL){ printf("開けません\n"); exit(1); } visual studio 2005\projects\meibo\meibo1.cpp(18) : error C3861: 'strcpy': 識別子が見つかりませんでした となります、どう言うことでしょうか。 よろしくお願いします。

  • atan2 オーバーロード関数の呼び出しを解決することができません

    はじめまして。 超初心者のものです。 かなり古いMayaのプラグインのソースファイルをコンパイルすることになり、以下のようなエラーが出てどうにも解決することができません。 1>.\MayaMath.cpp(164) : error C2668: 'atan2' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) 1> C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(547): 'long double atan2(long double,long double)' の可能性があります。 1> C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(499): または 'float atan2(float,float)' 1> C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(110): または 'double atan2(double,double)' 大変申し訳ないのですが、こういった場合の回避の仕方 などご存じの方がいましたらよろしくお願いいたします。

  • 乱数について

    Visual Studio2008を使っています。 #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void){ int i; srand(time(NULL)); i=rand(); printf("%d\n",i); return 0; } 乱数を作るために上のようなプログラミングを作りました。 これを「ソリューションのビルド」すると 【warning C4244: '引数' : 'time_t' から 'unsigned int' への変換です。データが失われる可能性があります。】 と出ます。 このまま行っても乱数が出来るのですが どうしたらいいのでしょうか? 8行目を srand(time_t(NULL)); srand((unsigned)time(NULL)); と変えればいいのでしょうか? time_tでやると乱数が同じ値しか出てきません。 教えてください。

  • C言語:計算問題を解く時間が計測できません

    C言語を学び始めて1週間程度のものです。 現在柴田望洋著の明解C言語中級編という本でC言語を学んでいます。 その中のプログラミング例を真似してプログラミングしているのですが、 うまく動作しません。詳細は以下の通りです。 著書のList2-6のプログラミングです。 問題:計算問題を解く時間を計測が0.0秒になってしまう。 ここよりプログラミングです。 #include <time.h> #include <stdio.h> #include <stdlib.h> int main (void) { int a, b, c; int x; clock_t start, end; double req_time; srand(time(NULL)); a = 10 + rand() % 90; b = 10 + rand() % 90; c = 10 + rand() % 90; printf("%d + %d + %dは何ですか:", a, b, c); start = clock(); while (1) { scanf("%d", &x); if (x == a + b +c) break; printf("\a違いますよ!!\n再入力してください:"); } end = clock(); req_time = (double)(end - start) / CLOCKS_PER_SEC; printf("%.1f秒かかりました。\n", req_time); if (req_time > 30.0) printf("時間がかかりすぎです。\n"); else if (req_time > 17.0) printf("まあまあですね。\n"); else printf("素早いですね\n"); return (0); } このプログラムを実行して計算を解いて正解の答えを入力しても 0.0秒かかりました。 素早いですね。 としかでてきません。どうすればきちんと時間を計測するプログラミングができるでしょうか。 パソコンはMacbookairを使っています。 コンパイラ(?)はXcodeというものを使っていると思います(ここらへんは勉強不足でよくわかりません。) もしよければご回答お願いします。