3

関数の実行時間を出力したいと考えています。何らかの理由で、タイマーが常に 0 を返します。理由を教えてもらえますか?

double RunningTime(clock_t time1, clock_t time2)
{
    double t=time1 - time2;
    double time = (t*1000)/CLOCKS_PER_SEC;
    return time;
}

int main()
{
     clock_t start_time = clock();


     // some code.....


    clock_t end_time = clock();

    std::cout << "Time elapsed: " << double(RunningTime(end_time, start_time)) << " ms";

    return 0;
}

使用しようとしましたがgettimeofday、それでも0が返されました。

double get_time()
{
    struct timeval t;
    gettimeofday(&t, NULL);
    double d = t.tv_sec + (double) t.tv_usec/100000;
    return d;
}

int main()
{
        double time_start = get_time();

        //Some code......

        double time_end = get_time();

        std::cout << time_end - time_start;

    return 0;
}

また、使用chronoしてみましたが、あらゆる種類のビルドエラーが発生しました:

  • エラー: #error このファイルには、今後の ISO C++ 標準である C++0x のコンパイラとライブラリのサポートが必要です。このサポートは現在
    実験段階であり、-std=c++0x または -std=gnu++0x コンパイラ オプションで有効にする必要があります。
  • 警告: 'auto' は C++0x では意味が変わります。削除してください
  • エラー: ISO C++ は型のない 't1' の宣言を禁止します エラー: 'std::chrono' は宣言されていません
  • エラー: '(t2 - t1)' のメンバー 'count' の要求は、非クラス型 'int' です

    int main() { auto t1 = std::chrono::high_resolution_clock::now();

                //Some code......
    
                auto t2 = std::chrono::high_resolution_clock::now();
    
                std::cout << "Time elapsed: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count() << " milliseconds\n";
    
            return 0;
        }
    
4

3 に答える 3

4

タイマー刻みは、1/CLOCKS_PER_SEC 秒にほぼ等しく、ミリ秒単位の分解能です。実数 (非ゼロ) を表示するには、非常に時間のかかる関数を呼び出すか、より高い時間分解能機能を備えた別のライブラリを使用する必要があります。

  • 新しい c++11x ライブラリchrono(MSVS 2012 を使用)
  • boost::chrono(残念ながら、ライブラリは他の多くのものを参照しています)
  • gettimeofday1 マイクロ秒の時間分解能を提供するPOSIX 関数
于 2012-06-20T00:20:12.897 に答える
0

たくさんの試行錯誤の末、私は一緒に行きましたgettimeofday。これが私がついに正しく動作するようになった私のコードです。

double get_time()
{
    struct timeval t;
    gettimeofday(&t, NULL);
    double d = t.tv_sec + (double) t.tv_usec/1000000;
    return d;
}

int main()
{
    double time_start = get_time();

    //Some code.........

    double time_end = get_time();

    std::cout << time_end - time_start;

    return 0;
}
于 2012-06-20T01:55:41.620 に答える
0

私が最近使用しているソリューションでは、C++11 のラムダ機能を使用して、任意の関数呼び出しまたは一連のアクションの時間を計っています。

#include <ctime>
#include <iostream>
#include <functional>

void timeit(std::function<void()> func) {
    std::clock_t start = std::clock();

    func();

    int ms = (std::clock() - start) / (double) (CLOCKS_PER_SEC / 1000);

    std::cout << "Finished in " << ms << "ms" << std::endl;
}

int main() {
    timeit([] {
        for (int i = 0; i < 10; ++i) {
            std::cout << "i = " << i << std::endl;
        } 
    });

    return 0;
}
于 2016-01-05T23:20:38.960 に答える