• ベストアンサー

プログラムの実行時間の計測について

プログラムの実行時間を計測したいのですが、 どのようにすればよいですか? 使っている言語はC++です。

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

  • ベストアンサー
  • terra5
  • ベストアンサー率34% (574/1662)
回答No.3

実行時間といった場合、経過時間の場合と、純粋にプログラムが使ったCPUの消費時間の場合があります。 また、精度もどの程度必要かによって、Cの標準的なライブラリにある程度の物でよいか、 OSなどに固有のものを使うかが変わってきます。 QueryPerformanceCounterはWindowsではもっとも精度が高い時間(時刻相当)が得られますが、ミリ秒以下の時間が必要なことはそうないと思いますのであまり使うことはないと思います。 gettimeofdayは値としてはマイクロ秒単位までありますが、精度はそこまでありません。 QueryPerformanceCounter並みの精度が必要な場合は他の物を使います。

その他の回答 (4)

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.5

がると申します。 もしUNIX系でなさっているようであれば、gettimeofdayという関数で細かい時間が取得できます。 あとは ・プログラムの前後に挟み込む ・別途「計測用プログラム」を組んで など、お好みの手段でOKかと思います。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

再び#1です。 環境が分からないので推測でしか答えられないのですが... フリースタンディング環境の場合、clock関数すら使えない可能性があります。 その場合でもμsec以下の精度で計測したいのであれば、適当な出力ポートに計測開始でHighを、計測終了でLowを出力するなどして、オシロスコープかロジックアナライザで計測するしかありません。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

プログラムの処理前後に計測用コードを埋め込んで実行時間を計測する方法で宜しいか? この条件で環境依存で良ければWindowsやLinuxでは数マイクロ秒程度の精度で実時間を計測できる方法があります。 WindowsではQueryPerformanceCounterを使います。処理前後にQueryPerformanceCounterを呼び出して差分をとり、別途QueryPerformanceFrequencyでカウンタ周波数を取って割り算で処理時間を計算します。 Linuxではgettimeofdayで1マイクロ秒単位の現在時刻を取得できるので処理前後で差分を取れば処理時間が分かります。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

環境に依存しない方法としては、clock関数を使うしかないと思います。 目視で計測できるほど実行時間が長いのであれば、ストップウォッチで計るというのも一つの手です。

関連するQ&A

  • プログラムの実行時間を計測する方法について

    私は、Tiny Basic for Windowsを使って、 プログラムの計算方法の違いによる、 プログラムが答えを導き出すまでの実行時間の違いを調べたいと思っています。 内容としては、入力された数が素数かどうかを調べるものなのですが、 大体のプログラムは完成しています。 後は、時間を計測するだけなのですが、 BASIC言語でプログラムの実行時間を表示させるプログラムなどはできるのでしょうか。 それ以外の方法でもかまいません。 とにかく大体の実行時間を知りたいと思っています。 ストップウォッチで自分が計るしかないのでしょうか。 実行時間を知るための方法を教えてください。 よろしくお願いします。

  • C言語で作ったプログラムの処理時間を計測するには

    C言語でいくつかのプログラムを作り、それぞれのプログラムの処理時間を計測し、比較したいと考えているのですがどのようにしたらいいのでしょうか?(0.1秒単位なので自分で計測するのはほぼ不可能です) 検索した結果 http://kzk9.net/column/time.html というサイトに辿り着きましたがよく理解できませんでした。 よろしくお願い致します。

  • fortran77のプログラム時間を計測したい

    fortran77のプログラム時間を計測したい こんばんわ。fortran77で実行結果が出るまでの時間の測定をしたいのですが、どうすればいいのでしょうか? 調べてみるといろいろな方法があるようです。しかし、そのほとんどがlinuxでの環境においての説明です。 私はwindowsの環境でfcpadを使ってコンパイルしています。ですので、「a.out」のコマンドを打ってプログラムを実行したことがありません。windows環境でもfortran77で時間計測というのはできますでしょうか? また、今回linuxの存在の大きさを感じた次第です。linuxでコンパイルするというのはメリットがあるのでしょうか?

  • プロセス実行速度の計測

    C言語でプロセスの実行速度の計測方法・ソース等、教えてください。

  • 実行時間の計測(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); } わかる方、回答を何卒お願いします。 (解答に必要な条件が足りないのでしたら、教えてください。すぐに追記します。)

  • プログラムの実行時間計測方法について

    プログラムの実行時間の計測方法について、質問します。 以下に示すプログラムは、パケットが受信される度にmessage関数が呼び出され、message関数内で受信したパケットをfwrite関数を用いて処理をしています。 [質問内容] clock関数のclock_t型を用いて、プログラムの実行時間を計測したいと思っています。しかし、以下に示すプログラムの場合、パケットが受信されるたびにmessage関数が呼び出され、かつパケットが受信される度にstart = clock()で0秒からの開始になってしまいます。 なにか、対策方法はあるのでしょうか? よろしくお願いします。 [プログラム] void main(int argc, char** argv){ //パケットが受信される度にmessage関数が呼ばれる。 message(); } void message(){ double time; clock_t start,finish; if(equals(msg->selector,(byte*)"test",strlen("test"))){ start = clock(); fwrite(msg->payload,msg->payload_length,1,fp); finish = clock(); time = (double)(finish - start)/1000.0; printf("データ送信時間:%f[sec]\n",time); } else if(equals(msg->selector,(byte*)"finish",strlen("finish"))){ done = D_TRUE; } }

  • あるプログラム実行中に別のプログラムを起動したい

    とあるC言語で出来たa.outというプログラム実行中に、b.outというプログラムを実行するプログラム「c.c」を作成したいのですが、どのようにプログラミングすればよいでしょうか? a.outは無限ループするような十分に実行時間の長いプログラムです。 ちなみに、c.cはシェルスクリプト「c.sh」でも構いません。

  • 他言語のプログラムを繋げて実行することは?

    C言語とVBなど他言語のプログラムを繋げるかして実行できますか?

  • eclipseでプログラムが実行できません

    プログラミング初心者です。 おかしな部分があるかと思います...。すみません...。 学校で出たC言語の課題を家でもやるために、eclipseをダウンロードしました。 MinGWもダウンロードしました。 C言語でプログラムを記述し、「すべてビルド」を押してから実行ボタンを押しましたが、「バイナリが見つかりません」というエラーが出てきてしまい、まったく実行できません。 ほかのサイトを参照しても、「コンパイル用のソフトをダウンロードしてありますか?」などの回答が多かったのですが、MinGWをダウンロードしてあるので何とも言えません。 プログラムはHello World!を表示させる程度の簡単なものです。 どのように操作をしたらうまく実行できるか教えてください。 また、eclipseとマイクロソフトのVisual Studioではどちらが使いやすいでしょうか。 ご回答よろしくお願いいたします。

  • プログラム実行中にプログラムを書き換えるには?

    実行中のプログラムの中でそのプログラムの一部を書き換えて保存するにはどうすればいいですか? 例えば次のようなプログラムの場合、このプログラムの中でTEXT("最初の文字列");の部分の文字列を別な文字列に変更しプログラムを更新したいです。 (プログラム終了後にもう一度実行すると「moji[20]=」の部分は前回実行時に書き換えた文字列が代入されているようにしたい) #include<windows.h> int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int ncmdshow){ TCHAR moji[20]=TEXT("最初の文字列"); MessageBox(NULL,moji,TEXT("文字列表示"),MB_OK); return 0; } --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語

専門家に質問してみよう