我正在尝试对一段代码进行基准测试。它基于这里的代码,有趣的部分看起来像这样:
auto t0 = std::chrono::high_resolution_clock::now();
...
auto t1 = std::chrono::high_resolution_clock::now();
std::cout << secs(t1-t0).count() << " sn";
问题是我在一台共享机器上,这给了我很长的时间,所以我的结果不一致。我真正需要的是某种秒表工具,它可以让我知道代码运行的时间,而不是时间。有哪些选择?如果涉及到系统特定的调用,我在Linux机器上,但如果可能的话,我宁愿保持这些代码的可移植性。
我看过其他问题,比如这个和这个,但它们似乎都提供了临时解决方案。
如果在您的操作系统上可用,您可以使用times API来获得与内置time
命令相似的结果。
#include <sys/times.h>
...
struct tms start, end;
times(&start);
//Do command
times(&end);
clock_t usr_time = end->tms_utime - start->tms_utime;
clock_t sys_time = end->tms_stime - start->tms_stime;
要100%完成,您应该检查times的结果不等于-1
,否则检查errno
代码。
Linux
#include <time.h>
#include <stdio.h>
double theseSecs = 0.0;
double startSecs = 0.0;
double secs;
double CPUsecs = 0.0;
double CPUutilisation = 0.0;
double answer = 0;
clock_t starts;
void start_CPU_time()
{
starts = clock();;
return;
}
void end_CPU_time()
{
CPUsecs = (double)(clock() - starts)/(double)CLOCKS_PER_SEC;
return;
}
struct timespec tp1;
void getSecs()
{
clock_gettime(CLOCK_REALTIME, &tp1);
theseSecs = tp1.tv_sec + tp1.tv_nsec / 1e9;
return;
}
void start_time()
{
getSecs();
startSecs = theseSecs;
return;
}
void end_time()
{
getSecs();
secs = theseSecs - startSecs;
return;
}
void calculate()
{
int i, j;
for (i=1; i<100001; i++)
{
for (j=1; j<10001; j++)
{
answer = answer + (float)i / 100000000.0;
}
}
}
void main()
{
start_time();
start_CPU_time();
calculate();
end_time();
end_CPU_time();
CPUutilisation = CPUsecs / secs * 100.0;
printf("n Answer %10.1f, Elapsed Time %7.4f, CPU Time %7.4f, CPU Ut %3.0f%n",
answer, secs, CPUsecs, CPUutilisation);
}
理想情况下,正如您的问题下提到的评论,您应该隔离您试图在main
中测量的代码片段,并且只使用unix time
命令行工具,该工具报告user
和system
时间。
如果您不能这样做,请考虑查看time
的源代码,并可能使用相同的技术对代码进行基准测试。
我认为您需要使用clock_gettime()
与以下时钟CLOCK_PROCESS_CPUTIME_ID
或CLOCK_THREAD_CPUTIME_ID
。它们给出了进程/线程所消耗的CPU时间。
CLOCK_PROCESS_CPUTIME_ID
High-resolution per-process timer from the CPU.
CLOCK_THREAD_CPUTIME_ID
Thread-specific CPU-time clock.
参考:- http://linux.die.net/man/3/clock_gettime
- 了解clock_gettime()的不同时钟
- http://www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime/
我认为给出merlin2011
的建议在许多情况下是不可行的,因为隔离可能需要大量的努力,而添加两行clock_gettime()
的代码是相当实用的。您甚至可以在类中包装对clock_gettime()
的调用。