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(不幸的是,图书馆引用了很多其他的)
  • POSIX 函数gettimeofday,它为您提供 1 微秒的时间分辨率
于 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 的 lambda 功能来计时任何任意函数调用或一系列操作。

#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 回答