检索C中两次迭代之间花费的时间
我有线程在运行,线程函数包含一个循环并迭代一定的时间 每个示例:检索C中两次迭代之间花费的时间,c,multithreading,clock,C,Multithreading,Clock,我有线程在运行,线程函数包含一个循环并迭代一定的时间 每个示例: void *start(void *p) // This function is called at the thread creation { int i = 0; while (i < 10){ i++; } } // NOTE THAT THIS FUNCTION IS AN EXAMPLE, the iteration can be small or high
void *start(void *p) // This function is called at the thread creation
{
int i = 0;
while (i < 10){
i++;
}
} // NOTE THAT THIS FUNCTION IS AN EXAMPLE, the iteration can be small or high.
如何有效地检索此类信息?我建议使用POSIX函数:
#包括
timespec real_startTime;
timespec real_endTime;
//开始时间测量
if(clock\u gettime(clock\u REALTIME和real\u startTime)!=0)
{
perror(“获取开始时间时出错”);
退出(退出失败);
}
//进行一些需要测量的长时间运行操作
//停止时间测量
if(clock\u gettime(clock\u REALTIME和real\u endTime)!=0)
{
perror(“获取结束时间时出错”);
退出(退出失败);
}
双实时运行时间=(real\u endTime.tv\u sec+real\u endTime.tv\u nsec/1000.0/1000.0)-(real\u startTime.tv\u sec+real\u startTime.tv\u nsec/1000.0/1000.0);
与时钟不同的是,它输出的是挂钟时间,即通过执行某些操作(包括I/O等)的“实时”时间,而不是基于CPU时间
除时钟外,其他人:
所有实现都支持系统范围的实时时钟,该时钟由clock_realtime标识。它的时间表示自新纪元以来的秒和纳秒
除钟表工外:
函数的作用是:返回所用处理器时间的近似值
通过程序
编辑:
正如许多人所建议的,在示例代码中不会遇到任何真正的差异(从0到10计算一个整数),但如果您测量一些长时间运行的系统,一个执行I/O的系统,等等),您会遇到任何实际差异。您可能希望在这里使用RTFM:另一个选择是使用探查器。使用哪一种可能取决于代码运行的平台。@alk:我当然读过,但我的问题主要是关于效率,也许是找到实现这些结果的另一种方法。1)将“while(I<10)”更改为“while(I<100000000)”。2) 买一块秒表。再加上一个“0”,你就可以使用烹饪计时器了。我在比萨饼和代码计时中使用了一个更为精确的“BIGTIME”。我不相信这样的调用能够精确地计时一个CPU,计数高达10。@MartinJames:你是对的,我在回答中添加了一条关于这一点的评论。这个回答的问题是,
clock\u gettime
是一个POSIX函数,而不是一个C函数。在标准C中,恐怕您只能使用clock()
和time()
。使用lttng怎么样?
(double)(begin - end) / CLOCKS_PER_SEC;
#include <time.h>
timespec real_startTime;
timespec real_endTime;
// Start time measurement
if(clock_gettime(CLOCK_REALTIME, &real_startTime) != 0)
{
perror("Error on fetching the start-time");
exit(EXIT_FAILURE);
}
// Do some long running operation that should be measured
// Stop time measurement
if(clock_gettime(CLOCK_REALTIME, &real_endTime) != 0)
{
perror("Error on fetching the end-time");
exit(EXIT_FAILURE);
}
double real_runTime = (real_endTime.tv_sec + real_endTime.tv_nsec / 1000.0 / 1000.0 / 1000.0) - (real_startTime.tv_sec + real_startTime.tv_nsec / 1000.0 / 1000.0 / 1000.0);