17571


C++初心者です。  
下のソースコードは独習C++ 第4版の第2章例2.1の3にデバッグ用にcoutをいくつか足したものです。  
timer型オブジェクトの作成から破棄までの時間を計測しています。

実行から1秒以上経過したあとにエンターキーを押してもclock関数から得られる値が予想と違ったものになっており、正しい経過時間を計算することができません。  
予想としては end-start
の値がCLOCKS_PER_SEC(1000000)の値より大きくなると思うのですが、実行してみるとendの値が3526、startの値が3402となっており、全く違ったものになります。

初歩的な質問であると思いますが、ご教授お願い致します。

[code]

    #include <iostream>
    #include <ctime>
    using namespace std;
    
    class timer {
      clock_t start;
    public:
      timer();
      ~timer();
    };
    
    timer::timer() {
      start = clock();
      cout << "start:" << start << "\n";
    }
    
    timer::~timer() {
      clock_t end;
      end = clock();
      cout << "end:" << end << "\n";
      cout << "経過時間:" << (end - start)  / CLOCKS_PER_SEC << "\n";
      cout << "CLOCKS_PER_SEC:" << CLOCKS_PER_SEC << "\n"; 
    }
    
    int main() {
      timer ob;
      char c;
    
      cout << "最後がエンターになるようにキーを入力:";
      cin >> c;
    
      return 0;
    }
    
[/code]

実行結果

[code]

    start:3402
    最後がエンターになるようにキーを入力:1234
    end:3526
    経過時間:0
    CLOCKS_PER_SEC:1000000
    
[/code]

環境

[code]

    $ g++ --version
    Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr ->-with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/D>eveloper/SDKs/MacOSX10.10.sdk/usr/include/c++/4.2.1
    Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
    Target: x86_64-apple-darwin14.0.0
    hread model: posix
    
[/code]


CC BY-SA 3.0
2015-10-13T00:05:35.703
17566
2015-10-13T13:43:29.343
12746
question
c++
C++のctimeヘッダのclock関数から得られる値が予想と違った値になる


`man clock` と入力して説明を読んでみましょう（あれば）  
`clock()` によって返却されるのは CPU 使用時間です（待っている時間は含まれない）。  
経過時間（ CPU を使わずに待っている時間を含む）ではないので、正しい動作です。

経過時間は `time()` で得ましょう。

ないしは CPU 使用時間 (純粋計算時間) がちゃんと得られるかの実験がしたいのであれば、  
数億回程度のループを作って中で演算してください。  
結果を使わない演算を行ってもコンパイラが最適化で除去したりするので、  
正しい「演算時間」（ないしは演算速度）を算出するのは、実はかなり難しかったりします。


CC BY-SA 3.0
2015-10-13T01:03:00.647
17569
2015-10-13T01:03:00.647
8589
17566
answer


ctime の clock() は、プログラムが処理を行った時間を返します。cin で入力を待っている間は、OS
に処理を任せているので、プログラム自身は処理を行っていません。つまり、どんなに長く待っても処理時間は増えません。

経過時間を求めたいなら、ctime の time() を使う手がありますが、返す時間が秒単位なのでつまらないかもしれません。

C++ 11 をお使いなら、新しい chrono の関数が使えます。

[code]

    #include <iostream>
    #include <chrono>
    
    using namespace std;
    using namespace std::chrono;
    
    int main()
    {
        // 開始時
        const steady_clock::time_point start = steady_clock::now();
    
        // 入力待ち
        char c;
        cout << "Enter something> ";
        cin >> c;
    
        // 終了時
        const steady_clock::time_point end = steady_clock::now();
    
        // 経過時間の計算
        duration<double> elapsed = duration_cast<duration<double>>(end - start);
    
        // 経過時間の表示
        cout << elapsed.count() << " seconds." << endl;
    
        return 0;
    }
    
[/code]


CC BY-SA 3.0
2015-10-13T01:14:18.700
17571
2015-10-13T13:43:29.343
2015-10-13T13:43:29.343
3605
3605
17566
answer