掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

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

掲示板2

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

No.29142

FedraCore6でclock()が機能せず?
投稿者---Mr.Boo(2006/12/05 10:12:48)


開発環境:FedraCore6
     gcc version4.1.1

テキストに載っていたC++の動作確認をしているのですが、下記のソースファイルのclock()から経過時間が帰ってきません。

clock()を使って、経過時間を計算するのに、startで時間取得後遅延をキー入力で発生させ、endで経過時間を取得するのですが、endに経過時間が帰ってこずに0が帰ってきます。

まったく同じソースをWindows2000、Borland C++ 5.5.1で確認したところ、きちんと経過時間が帰ってきました。
FedoraCore、またはgccの使い方を間違えているのでしょうか。
なお、gccではコマンドラインに以下のコマンドを入力し、コンパイルしています。

g++ -o TimerTest TimerTest.cpp

どなたか、情報をお持ちでないでしょうか。

#include <iostream>
#include <ctime>
using namespace std;

class timer{
    clock_t        start;
public:
    timer();
    ~timer();
};

timer::timer()
{
    start = clock();
    cout << "Start" << start << endl;
}

timer::~timer()
{
    clock_t        end;

    end = clock();
    cout << "経過時間" <<
        (end - start) / CLOCKS_PER_SEC << endl;
}

int main(void)
{
    timer    time;
    char    c;

    // 遅延時間
    cout << "最後が[ENTER]になるようにキーを入力: ";
    cin >> c;

    return 0;

}





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:FedraCore6でclock()が機能せず? 29143 かずま 2006/12/05 11:11:51


No.29143

Re:FedraCore6でclock()が機能せず?
投稿者---かずま(2006/12/05 11:11:51)


> FedoraCore、またはgccの使い方を間違えているのでしょうか。

Linux/gcc の clcok() はそのプロセスの CPU使用時間を返しているのでは
ないでしょうか?
キー入力待ちの間、CPU は他のプロセスに割り当てられています。


この投稿にコメントする

削除パスワード

No.29144

Re:FedraCore6でclock()が機能せず?
投稿者---Mr.Boo(2006/12/05 11:55:57)


>> FedoraCore、またはgccの使い方を間違えているのでしょうか。
>
>Linux/gcc の clcok() はそのプロセスの CPU使用時間を返しているのでは
>ないでしょうか?
>キー入力待ちの間、CPU は他のプロセスに割り当てられています。
そのようですね。
長いループをまわしてclockで時間取得すれば、値が帰ってきました。
同じプロセッサ時間を取得する関数としているのに、どうしてWindowsではキー待ち時間もカウントされるのに、Linux/gccではカウントされないのでしょうね?

どなたか、ご存知の方、おられます?



この投稿にコメントする

削除パスワード

No.29156

Re:FedraCore6でclock()が機能せず?
投稿者---yoh2(2006/12/05 21:59:28)


>同じプロセッサ時間を取得する関数としているのに、どうしてWindowsではキー待ち時間もカウントされるのに、Linux/gccではカウントされないのでしょうね?

「どうして」はともかくとして、プロセッサ時間というのは割と定義があいまいで、あまり
ポータビリティを期待してはいけない部類に入ります。
Linux(や、大部分のUNIX系OS)では、プロセッサ時間といえばそのプロセスが実際に動いた時間
のみを指し、スケジューリング待ちやデータ待ちでスリープしていた時間を含みません。
一方、Windowsでは、プロセスが動いた実時間のことを指すんでしょうね。未確認ですが。

ちなみに、cygwinを使った場合、gccに -mno-cygwin オプションを付けてコンパイル
(Windowsネイティブ)するとキー待ち時間が含まれ、-mno-cygwinを付けなければ
(cygwin.dll利用)キー待ち時間が含まれなくなるという面白い現象が起こります。

また、同じUNIX系でも、子プロセスを作って、その終了待ちをした場合、その子プロセスが
動作した時間が含まれるOSも含まれないOSもあり、これまた一貫性がありません。
(Linuxでは含まれません)


実時間を計測したいなら、秒単位でよいならtime()を使ってみてはいかがでしょう?
秒以下の単位まで計測したいとなると、標準のCの範囲を外れてしまいますが、
POSIX関数のgettimeofday()やclock_gettime()が使えます。


この投稿にコメントする

削除パスワード

No.29162

Re:FedraCore6でclock()が機能せず?
投稿者---Mr.Boo(2006/12/06 11:25:17)


>Linux(や、大部分のUNIX系OS)では、プロセッサ時間といえばそのプロセスが実際に動いた時間
>のみを指し、スケジューリング待ちやデータ待ちでスリープしていた時間を含みません。
>一方、Windowsでは、プロセスが動いた実時間のことを指すんでしょうね。未確認ですが。
>
>ちなみに、cygwinを使った場合、gccに -mno-cygwin オプションを付けてコンパイル
>(Windowsネイティブ)するとキー待ち時間が含まれ、-mno-cygwinを付けなければ
>(cygwin.dll利用)キー待ち時間が含まれなくなるという面白い現象が起こります。
>
>また、同じUNIX系でも、子プロセスを作って、その終了待ちをした場合、その子プロセスが
>動作した時間が含まれるOSも含まれないOSもあり、これまた一貫性がありません。
>(Linuxでは含まれません)
>
>
yoh2さん、ありがとうございます。
参考にしているテキストでも、clock()はあまり当てにしないように書いてあったので、どうしてもclock()というわけではないのですが、ただ引っかかりを残したまま、先に進みたくなかったので、質問をしました。
まぁ、こういう標準関数はどうしても、システムに依存してしまうし100%互換をを保障できないのでしょうね。



この投稿にコメントする

削除パスワード

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