←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4157

clock関数の信頼性
投稿者---some-begginer(2005/07/01 22:18:43)


clock関数の信頼性などについて教えて頂きたくお願い申し上げます.

次のようなプログラムで
プログラムの一部の実行時間を計測しようとしていますが,
時折,負の値が表示されてしまいます:

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

int main(void){
  double start, end;

  /*** 何かの処理 ***/

  start = clock();
  /*** 実行時間を計測したい処理 ***/
  end = clock();

  printf("%.16f\n", (end-start)/CLOCKS_PER_SEC);

  /*** 何かの処理2nd ***/
  return 0;
}


実行する度に小数点以下下位の桁が異なるのは,
値自体に再現性はないものと諦めている(それほど高精度を必要としていませんし)のですが,
負の値になるのには困っております.

上のプログラムの表示が負になるためには変数startが変数endよりも
大きくなければなりません.
変数startにclock関数の戻り値を格納する場所は明らかに,
変数endにclock関数の戻り値を格納する場所より前です.

[Q1]clock関数の精度は複数回呼び出された場合にその順序と戻り値の大小関係が崩れる程に悪い可能性があるものなのでしょうか?

[Q2]複数回呼び出されるclock関数の順序が入れ替わることがあるのでしょうか?

教えて頂ければ幸いです.
実行環境はVine Linux, コンパイラはgcc version 2.95.3 20010315です.
よろしくお願い申し上げます.


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:clock関数の信頼性 4158 まきじ 2005/07/01 23:36:11
<子記事> Re:clock関数の信頼性 4163 まきじ 2005/07/02 00:55:49


No.4158

Re:clock関数の信頼性
投稿者---まきじ(2005/07/01 23:36:11)


>[Q2]複数回呼び出されるclock関数の順序が入れ替わることがあるのでしょうか?

手続き型言語ですから、ありえないと思います。


この投稿にコメントする

削除パスワード

No.4172

Re:clock関数の信頼性
投稿者---some-begginer(2005/07/02 16:13:53)


>>[Q2]複数回呼び出されるclock関数の順序が入れ替わることがあるのでしょうか?
>
>手続き型言語ですから、ありえないと思います。

お返事有難うございます.
別の原因ということですね.


この投稿にコメントする

削除パスワード

No.4163

Re:clock関数の信頼性
投稿者---まきじ(2005/07/02 00:55:49)


>負の値になるのには困っております.
>[Q1]clock関数の精度は複数回呼び出された場合にその順序と戻り値の大小関係が崩れる程に悪い可能性があるものなのでしょうか?

MSDN に
「経過時間を取得できない場合は、clock_t にキャストした ? -1 を返します。」
と記載されています。

-1 ではないでしょうか?


この投稿にコメントする

削除パスワード

No.4165

Re:clock関数の信頼性
投稿者---si(2005/07/02 01:43:38)


訂正
/*** 実行時間を計測したい処理 ***/
があまりにも短過ぎる可能性はありませんか?
-1 が帰ってないか表示してみる
printf("%ld %ld\n",start,end);


この投稿にコメントする

削除パスワード

No.4174

Re:clock関数の信頼性
投稿者---some-begginer(2005/07/02 16:21:17)


>訂正
>/*** 実行時間を計測したい処理 ***/
>があまりにも短過ぎる可能性はありませんか?
>-1 が帰ってないか表示してみる
>printf("%ld %ld\n",start,end);

計測したい処理は数万個の配列のバブルソートなどなので,
あまりにも短すぎると言うことはない(と思う)のですが,
たしかに,-1が返却されていました.
有難うございました.


この投稿にコメントする

削除パスワード

No.4175

Re:clock関数の信頼性
投稿者---まきじ(2005/07/02 16:28:56)


>計測したい処理は数万個の配列のバブルソートなどなので,
>あまりにも短すぎると言うことはない(と思う)のですが,

長時間の計測には、time() と difftime() を使うのが良いと思います。


この投稿にコメントする

削除パスワード

No.4187

Re:clock関数の信頼性
投稿者---some-begginer(2005/07/04 15:00:51)


>>計測したい処理は数万個の配列のバブルソートなどなので,
>>あまりにも短すぎると言うことはない(と思う)のですが,
>
>長時間の計測には、time() と difftime() を使うのが良いと思います。

time関数は現在時刻を戻り値とするものなので,
プロセッサ時間を計測するのでなく,
実際に掛かった時間(他プロセスの実行時間も含まれる)を計測するものと
思っていたのですが,どうなのでしょう?

「長時間」とは,clock_tの戻り値の最大値
(私が使っているVine LinuxではLONG_MAX)
を越えて計測する場合ということでしょうか?

度々の質問で恐縮ですが,教えて頂ければ幸いです.


この投稿にコメントする

削除パスワード

No.4188

Re:clock関数の信頼性
投稿者---まきじ(2005/07/04 15:56:53)


>time関数は現在時刻を戻り値とするものなので,
>プロセッサ時間を計測するのでなく,
>実際に掛かった時間(他プロセスの実行時間も含まれる)を計測するものと
>思っていたのですが,どうなのでしょう?

終わった時刻から、開始した時刻を引けば、掛かった時間がでる。
clock() でも time() でも、他のプロセスは関係ないと思いますが。

clock() はプログラムが実行されてからの時間。
time() は、現在時刻。

>「長時間」とは,clock_tの戻り値の最大値
>(私が使っているVine LinuxではLONG_MAX)
>を越えて計測する場合ということでしょうか?

については、http://www.mm2d.net/c/c-02.shtml を参照。


この投稿にコメントする

削除パスワード

No.4191

Re:clock関数の信頼性
投稿者---some-begginer(2005/07/04 18:38:02)


早速のお返事有難うございます.

>http://www.mm2d.net/c/c-02.shtml を参照。

ご紹介頂きましたWWWによれば,
clock関数はプロセッサ時間でtime関数は実時間を計測するのですね.
よって,プロセッサ時間を測りたい場合は上限を越えないことを前提に,
やはりclock関数を使うべきなのですね.


この投稿にコメントする

削除パスワード

No.4173

Re:clock関数の信頼性
投稿者---some-begginer(2005/07/02 16:16:28)


>>負の値になるのには困っております.

>MSDN に
>「経過時間を取得できない場合は、clock_t にキャストした ? -1 を返します。」
>と記載されています。
>
>-1 ではないでしょうか?

確かにそうでした.
clock関数の戻り値を確認しないといけないということですね.
有難うございました.


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity