记录代码所用的时间

时间:2015-09-03 19:37:33

标签: c++ c++11

我使用以下函数查找代码所用的时间。

  #include <sys/time.h>
  struct timeval start, end;
  gettimeofday(&start,NULL);   
  //mycode   
  gettimeofday(&end,NULL);
  cout<<" time taken by my code: "<<((end.tv_sec - start.tv_sec) * 1000000 + end.tv_usec - start.tv_usec ) / 1000.0<<" msec"<<endl;

我观察到即使我的代码运行了2个小时,但上述函数报告的时间是1213毫秒。我无法理解为什么会发生这种情况。还有一种方法可以在几小时内记录我的代码所花费的时间

4 个答案:

答案 0 :(得分:7)

我最好的猜测是,系统上的time_ttv_sec的类型)标记为32位且(end.tv_sec - start.tv_sec) * 1000000溢出。

您可以通过确保不使用32位算术进行此计算来测试该理论:

(end.tv_sec - start.tv_sec) * 1000000LL

话虽如此,我建议使用C ++ 11 <chrono>库:

 #include <chrono>

  auto t0 = std::chrono::system_clock::now();
  //mycode
  auto t1 = std::chrono::system_clock::now();
  using milliseconds = std::chrono::duration<double, std::milli>;
  milliseconds ms = t1 - t0;
  std::cout << " time taken by my code: " << ms.count() << '\n';

<chrono>库有一个不变的&#34;预定义&#34;持续时间将在不到+/- 292年内溢出。实际上,只有nanoseconds会快速溢出,其他持续时间会有更大的范围。每个持续时间都有静态::min()::max()函数,您可以使用这些函数查询每个函数的范围。

original proposal for <chrono>有一个不错的教程部分,可能是一个有用的介绍。它只是略微过时了。它所谓的monotonic_clock现在称为steady_clock。我相信这是它缺乏的唯一重要更新。

答案 1 :(得分:1)

你在哪个平台上这样做?如果它是类似Linux / Unix的最简单的非侵入式赌注,只需使用命令行中的time命令即可。您运行的代码是否是单线程的? time.h中的一些函数(如clock()例如)返回每个核心的滴答数,这可能是也可能不是你想要的。计时器中的新东西可能没有你想要的那么精确(一段时间后我试着用计时器测量纳秒级的时间间隔,但是我回到那时的最低时间间隔是300ns,这比我的精确度要低得多我希望。

答案 2 :(得分:0)

这部分基准测试过程可能有助于您的目的:

#include<time.h>
#include<cstdlib>
...
...
float begin = (float)clock()/CLOCKS_PER_SEC;
...
//do your bench-marking stuffs
...
float end = (float)clock()/CLOCKS_PER_SEC;
float totalTime = end - begin;
cout<<"Time Req in the stuffs: "<<totalTime<<endl;

注意:此过程是 chrono

的简单替代方法

答案 3 :(得分:0)

如果您使用Linux并且您想要计时的代码主要是程序本身,那么您可以将程序作为参数传递给time命令并查看“已用时间”#39。 ;行。

/usr/bin/time -v <your program's executable>

例如:

/usr/bin/time -v sleep 3                                                                                         .../home/aakashah/workspace/head/src/GroverStorageCommon
        Command being timed: "sleep 3"
        User time (seconds): 0.00
        System time (seconds): 0.00
        Percent of CPU this job got: 0%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.00
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 2176
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 0
        Minor (reclaiming a frame) page faults: 165
        Voluntary context switches: 2
        Involuntary context switches: 0
        Swaps: 0
        File system inputs: 0
        File system outputs: 0
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0