UNIX times関数を使った時間計測

このQ&Aのポイント
  • UNIX times関数を使用したプログラムの実行時間を詳細に計測する方法を教えてください。
  • times関数を使えば実行中のプロセスや子プロセスが消費したユーザCPU時間とシステムCPU時間を取得できます。
  • sysconf()でクロック時間を得ることまではできましたが、どうすればより詳細な時間計測ができるかアドバイスをお願いします。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • chirubou
  • ベストアンサー率37% (189/502)
回答No.1

プログラムの目的がよく分かりませんでした。 times() は自分とその子プロセスの実行時間(の和)を返します。 もし、fork() した子プロセスだけの実行時間を知りたいのなら、wait3() や wait4() で返される struct rusage の値を見る必要があります。

関連するQ&A

  • 実行時間の計測(C言語)

    実行時間について教えてください。 実行時間について不可思議な現象が起きたので疑問に思いました。 C言語においてfor文の2億回ループする場合の実行時間を計測し、計測する内容を変えます。 以下のプログラムのように、時間を計測します。 --------------------        ・        ・ gettimeofday(&t0, NULL);  (計測したい処理) gettimeofday(&t1, NULL);        ・        ・ --------------------- (計測したい処理)に以下のようなプログラムを入れ時間を計測しました。 以下、(計測したい処理)  → それにかかった実行時間 <実行結果 書式(計測したい処理) → 計測された時間 > (1)for ( i = 0; i < 2000000000; i++);         →  5.412432 sec (2)for ( i = 0; i < 2000000000; i++, a++);      →  5.401164 sec (3)for ( i = 0; i < 2000000000; i++, a++,a++);   →  9.340447 sec (4)for ( i = 0; i < 2000000000; i++, a++,a++,a++);   →  13.985456 sec この結果を受けての疑問(1) (2)~(4)までは、加算する回数(a++)が2倍、3倍と増えたため、線形的に実行時間が増えるという理屈で納得できるのですが、 (1)~(2)について、加算する回数(a++)が増えているのに、なぜ実行時間が(1)と(2)では変わらないのか。 アセンブラに直すと、確かに加算回数は増えているはずです。 <実行結果 書式(計測したい処理) → 計測された時間 > (5)for ( i = 0; i < 2000000000; i++);           →  5.412432 sec (6)for ( i = 0; i < 2000000000; i++, a++);        →  5.401164 sec (7)for ( i = 0; i < 2000000000; i++, a++,b++);     →  4.019215 sec (8)for ( i = 0; i < 2000000000; i++, a++,b++,c++);   →  4.008310 sec   実行結果を受けての疑問(2) なぜ、(6)~(7)では、加算される回数は増えているにも関わらず、 (5)より実行時間は短くなっているのか。 ((3)と(7)の時間差があることについは、対象となるレジスタが違うため、並行処理をしていると推察できることはわかります。今回は(5)~(8)にかけて、なぜ実行時間が短くなるのかという質問です。) <前提> ・前提として、プログラム内容に間違いはない。 ・バックグラウンドで動いているプログラムの影響は受けていないとします。 (何度も実行して確認しているので常にこのような結果が得られました。) 疑問1、2について、推測できる理由を教えてください。 <環境> ・Windows7 Corei5 上で VMwareによってUbuntuで実行しています。(VMwareのコア数の設定は1) ・メモリはWindowsOS、VMwareによる設定共に2GB <ソース> #include <stdio.h> #include <sys/time.h> // gettimeofday int main() { struct timeval t0, t1; long l; long i; long h; long j; long k; i = 0; h = 0; l = 0; j = 0; k = 0; gettimeofday(&t0, NULL); for ( i = 0; i < 2000000000; i++,l++,h++,j++); /*この部分の加算を変更して計測しています。*/ gettimeofday(&t1, NULL); printf("i = %ld, l = %ld, h=%ld \n",i,l,h); t1.tv_sec -= t0.tv_sec; if (t1.tv_usec < t0.tv_usec) { t1.tv_sec -= 1; t1.tv_usec += 1000000 - t0.tv_usec; } else { t1.tv_usec -= t0.tv_usec; } printf("%d.%06d sec\n", t1.tv_sec, t1.tv_usec); } わかる方、回答を何卒お願いします。 (解答に必要な条件が足りないのでしたら、教えてください。すぐに追記します。)

  • 処理時間計測

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

  • 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というものを使っていると思います(ここらへんは勉強不足でよくわかりません。) もしよければご回答お願いします。

  • 処理時間の計測中に、任意の時間が経過してしまったら、警告表示を行いたいですが、方法が分からないでいます

    C++で、 ある処理の実行に要する時間の計測を行う ソースを書いていたのですが、 時間の計測を開始してから、 3秒以上が経過してしまった場合にのみ、 処理の進行状況に関わらず、 「3秒経過済み」と表示してあげたいと思っていましたが、 時間の計測を、 「difftime」などで表示する方法は分かったものの、 処理の実行中に、3秒以上経過したら、 取り合えず、「3秒経過済み」と表示させる方法が 分からないでいます。 何かアドバイスいただけるとありがたいです。 宜しくお願い致します。 ====================== time_t start, end; time( &start ); //計測開始 //処理が実行される //処理時間の計測中に「最初の3秒が経過してしまった場合」にのみ「3秒経過済み」と表示してあげたい time( &end );//計測終了 ======================

  • clock関数での経過時間計測

    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秒になるのはこれのせいだと思うのですが、どうして同じ値になるのでしょうか?

  • CGIの表示時間、測定

    Perlを使っています。 CGIの表示時間の測定で、 ********************** $start = (times)[0]; 処理内容 HTML等 $end = (times)[0]; $speed = $end-$start; printf("消費時間: %.5f CPU秒",$speed); ******************* 大体かと思いますが、処理時間の目安としていました。 でも、最近新しいCPUが高いPCを買って、表示速度 が"0.01600 CPU秒" か、"0.00000 CPU秒"にしか、 なりません。 もっと細かく分かる方法はありませんでしょうか?

    • ベストアンサー
    • CGI
  • time()関数について

    このたび、一定処理にかかる時間を調べるために、 次のようなプログラムを作成しました。 #include <stdio.h> #include <time.h> int main(void) { int i; long time; time_t t1, t2; time(&t1); for (i = 1; i <= 5000; i++) { printf("%d, ", i); } time(&t2); printf("\nTime1 = %lf\tTime2 = %lf\n", t1, t2); time = t2 - t1; printf("かかった時間:%lf\n", time); return 0; } 1-5000まで、数字を表示するために、 こういうプログラムを作ったのですが、 どうもtime()関数のところでエラーが出ます。 関数でないものを呼び出している(関数 main ) とでます。time.hをインクルードしてあるのですが、 何が原因なのか分かりません。 コンパイラはBCC5.5を使っています。 ご教授願います。

  • 時間以外にもあるのでしょうか?

    本日からプログラム(C)の勉強をしています。 少し疑問に思ったことがあるのでよろしければ教えてください。 起動時に1・2・3の数字を出力するものをつくりました。 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ #include <stdio.h> #include <time.h> #include <stdlib.h> main () {     int computer;     srand(time(NULL));     computer = rand() % 3 + 1;     printf("コンピューターは %d", computer);     return 0; } ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ ・実行するたびに異なる数字を出力したかったので今回は「時間」を使いましたが、「時間」以外に使えるものはないのでしょうか? (「日付」「年」などでもいけそうなのですが、短時間に数回実行する場合は同じ結果がでそうです) 短時間に数回実行しても異なる数字を出力できるものをおねがいします。 ・「時間」の場合、日本ではすべての人が同じ時間を共有しているので同じタイミングで実行した場合は同じ結果がでるのでしょうか? 以上二点ですが回答をおねがいします。

  • 計算処理時間を出力したい!

    素因数分解を行うプログラムにおいて、処理時間を計算する必要があります。 #include <stdio.h> #include <time.h> main() unsigned long i,t0,t1; t0 = clock(); for(i=0; i<100000; i++){ } t1 = clock(); printf("Time : %lf\n", t1 - t0); } などと例を作ってテストしているのですが、小さな単位まで出てきません。 100分の1秒単位で出てきているとおもいます。 もっと細かい時間を計測するのにはどうしたらいいのでしょうか?

  • 処理能力計測について

    現在処理能力を計算するプログラムを組んでいます。 time_t start,end; : start=time(NULL); 時間を計測したい処理 end=time(NULL); printf("time %.0f s\n",difftime(end,start)); このように書いているのですが、出力は秒単位になります。もっと細かい単位で計りたいのですが、どうしたらよろしいでしょうか? よろしくお願いします。

専門家に質問してみよう