none
timeGetTimeで動作時間を測りたい。 RRS feed

  • 質問

  • timeGetTimeで動作時間を測りたいのですが、ヘッダはなにか、とかソースがあっているのか教えてください。

    double start = timeGetTime();
    double end = timeGetTime();
    double elapsed = (end - start);
    printf( "time=%lf\n",elapsed);

    ミリsecが測りたいです。


    まさ
    2009年4月8日 21:59

回答

  • はじめまして、ミッヒーといいます。

    VC++ 6.0 から引っ越してきたばかりなので、とんちんかんな答えかも知れませんが、私の知識内で一応回答を。

    timeGetTime はミリ秒単位で DWORD 値を返します。
    double ではありません。

    それと、timeGetTime 関数が返す DWORD 値は DWORD の最大値を超えると 0 に戻る実装になっています。

    必要なヘッダは #include <mmsystem.h>
    ライブラリは winmm.lib です。余談ですが、私は #include <mmsystem.h> の次の行に #pragma comment (lib, "winmm.lib") という方法で、ソースコード単位でライブラリとリンクする手法をよく使います。

    ただ、timeGetTime 関数は CCriticalSection、WaitForMulitpleObject 等のカーネル関数群と併用しない様、注記があったのを記憶しています。

    VC++ 6.0 以降の環境には詳しくないので、間違っている場合など、どなたかフォローをお願いします。
    • 回答としてマーク sinsinn 2009年4月17日 10:46
    2009年4月9日 6:17

すべての返信

  • はじめまして、ミッヒーといいます。

    VC++ 6.0 から引っ越してきたばかりなので、とんちんかんな答えかも知れませんが、私の知識内で一応回答を。

    timeGetTime はミリ秒単位で DWORD 値を返します。
    double ではありません。

    それと、timeGetTime 関数が返す DWORD 値は DWORD の最大値を超えると 0 に戻る実装になっています。

    必要なヘッダは #include <mmsystem.h>
    ライブラリは winmm.lib です。余談ですが、私は #include <mmsystem.h> の次の行に #pragma comment (lib, "winmm.lib") という方法で、ソースコード単位でライブラリとリンクする手法をよく使います。

    ただ、timeGetTime 関数は CCriticalSection、WaitForMulitpleObject 等のカーネル関数群と併用しない様、注記があったのを記憶しています。

    VC++ 6.0 以降の環境には詳しくないので、間違っている場合など、どなたかフォローをお願いします。
    • 回答としてマーク sinsinn 2009年4月17日 10:46
    2009年4月9日 6:17
  • こんにちは、MDといいます。

    timeGetTimeの戻り値の型については、他の方が説明しているので省きますが、
    正確な値を測りたいのであれば「timeBeginPeriod」「timeEndPeriod」をご使用になるとよいでしょう。
    このAPIは最小分解能を設定するAPIです。

    2009年4月9日 8:20
  • 回答をありがとうございます。

    「timeBeginPeriod」「timeEndPeriod」ついてもう少し詳しく教えてください。

    よろしくお願いします。
    まさ
    2009年4月9日 10:17
  • ヘルプを見るクセをつけましょう。
    そうしないと、この先、延々と質問を続けることになりますよ。

    timeGetTime: http://msdn.microsoft.com/ja-jp/library/cc428795.aspx
    timeBeginPeriod: http://msdn.microsoft.com/ja-jp/library/cc428791.aspx
    timeEndPeriod: http://msdn.microsoft.com/ja-jp/library/cc428792.aspx

    必要なヘッダやライブラリも書いてありますし、timeGetTime の戻り値が DWORD でミリ秒を意味することや、精度に関する詳しい情報も記述されています。
    timeBeginPeriod, timeEndPeriod の場合は、timeBeginPeriod で最小分解能を指定して timeGetTime を呼び出し、測定終了後に timeEndPeriod で最小分解能を元に戻すという流れになります。
    また、ヘルプには timeEndPeriod の引数を timeBeginPeriod と同じ値にする点に注意が必要なことも書かれています。

    ついでに、細かいことですが printf の %lf は C99 以外では規格外です。
    %f を使うようにしましょう。
    参考: C FAQ 12.9 http://www.kouno.jp/home/c_faq/c12.html#9
    2009年4月9日 11:26
  • NT系に限定されますが動作時間を計るならGetProcessTimesやGetThreadTimesを使った方がいいと思います
    理由はtimeGetTimeなどの経過時刻だけで計ると「実行されていなかった時間」が考慮されません
    2009年4月10日 15:02
  • カーネル関数と併用しない云々の制限ははtimeGetTimeにはありません。
    おそらく、TimerProcコールバック内で使えない話と混同されているのでしょう。

    jzkey
    2009年4月11日 18:12
  • jzkey さんのご指摘の通り、timeGetTime 関数にカーネル関数と併用してはいけない、等と言う記述はありませんでした。

    何か別のものと勘違いしていたようです。それが何かは、まだ思い出せていませんが。

    このスレッドに書き込まれた皆さん、そしてご覧の皆さん、間違った情報を書き込み、ご迷惑をかけました。
    2009年4月12日 4:54
  • 思い出せたので、一応ご報告までに。

    jzkey さんのご指摘の通り、timeSetEvent 関数に設定するコールバック関数内からは一部の関数しか使えない、 という話でした。このコールバック関数内からは PostMessage 関数等、一部の関数しか使えません。

    jzkey さん、ありがとうございました。timeSetEvent という関数名から、MFC クラス CEvent を連想し、イベントの処理中 (WaitforSingleObject 等で停止中のスレッド内等) に timeGetTime 関数は使えないと間違って覚えていたようです。

    思い出せたので、すっきりしました。

    同時に前回の書き込み同様、皆さん、ご迷惑をかけました。
    • 編集済み ミッヒー 2009年7月8日 17:33 前回の修正漏れ
    2009年4月13日 1:19