我使用以下函数查找代码所用的时间。
#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毫秒。我无法理解为什么会发生这种情况。还有一种方法可以在几小时内记录我的代码所花费的时间
答案 0 :(得分:7)
我最好的猜测是,系统上的time_t
(tv_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