Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检索C中两次迭代之间花费的时间_C_Multithreading_Clock - Fatal编程技术网

检索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);