题
编辑: 我刚刚发现我的问题之后写这个长后来说明每一个小细节...如果有人能给我一个好的答案在我在做什么错和如何可以获得执行时间在一秒(使用浮动与5位小数位或如此),我会记得为接受。提示:问题是我怎么解释clock_getttime()man page。
嗨,
让我们说有一个功能,名为 myOperation
我需要测量的执行时间。来衡量它,我使用 clock_gettime()
因为它是建议 在这里, 在一个意见。
我的老师建议我们得以衡量它 N
时间使我们可以得到一个平均值,标准差和中位数的最后报告。他还建议我们执行 myOperation
M
倍,而不是只有一个。如果 myOperation
是一种非常快速的运行,测量它 M
时间使我们能够得到有意义的"实时"这需要;会导致时钟正在使用可能没有所需的精度测量这种操作。因此,执行 myOperation
只有一个时间或 M
时间真的取决于如果操作本身需要足够长的时钟精我们正在使用。
我有麻烦的处理, M
次执行。增加 M
减少(很多)的最后平均值。这没有道理我。是这样的,平均你把3到5秒能从A点到B但是然后你从A到B和后来的5倍(这使得它10倍,导致一个B是同作为B)和测量。比你分10平均你应该是相同的平均你把车从A点到B,这是3到5秒钟。
这就是我想要我的代码做到的,但是它不工作。如果我继续增加的次数,I从A到B和回,平均将下下的每个时刻,这是没有意义我。
足够的理论,这是我的代号:
#include <stdio.h>
#include <time.h>
#define MEASUREMENTS 1
#define OPERATIONS 1
typedef struct timespec TimeClock;
TimeClock diffTimeClock(TimeClock start, TimeClock end) {
TimeClock aux;
if((end.tv_nsec - start.tv_nsec) < 0) {
aux.tv_sec = end.tv_sec - start.tv_sec - 1;
aux.tv_nsec = 1E9 + end.tv_nsec - start.tv_nsec;
} else {
aux.tv_sec = end.tv_sec - start.tv_sec;
aux.tv_nsec = end.tv_nsec - start.tv_nsec;
}
return aux;
}
int main(void) {
TimeClock sTime, eTime, dTime;
int i, j;
for(i = 0; i < MEASUREMENTS; i++) {
printf(" » MEASURE %02d\n", i+1);
clock_gettime(CLOCK_REALTIME, &sTime);
for(j = 0; j < OPERATIONS; j++) {
myOperation();
}
clock_gettime(CLOCK_REALTIME, &eTime);
dTime = diffTimeClock(sTime, eTime);
printf(" - NSEC (TOTAL): %ld\n", dTime.tv_nsec);
printf(" - NSEC (OP): %ld\n\n", dTime.tv_nsec / OPERATIONS);
}
return 0;
}
注: 上 diffTimeClock
功能是从这个 博客.我更换我的真正作用 myOperation()
因为它不会使任何有意义的后我的真实的功能,因为我会以后的长块代码,可以很容易地代码 myOperation()
与任何你喜欢的编码,如果你的愿望。
正如你可以看到, OPERATIONS = 1
结果是:
» MEASURE 01
- NSEC (TOTAL): 27456580
- NSEC (OP): 27456580
对于 OPERATIONS = 100
结果是:
» MEASURE 01
- NSEC (TOTAL): 218929736
- NSEC (OP): 2189297
对于 OPERATIONS = 1000
结果是:
» MEASURE 01
- NSEC (TOTAL): 862834890
- NSEC (OP): 862834
对于 OPERATIONS = 10000
结果是:
» MEASURE 01
- NSEC (TOTAL): 574133641
- NSEC (OP): 57413
现在,我不是数学专家,远离实际,但这不会让任何感觉到我的任何责任。我已经谈到了这个朋友就在这个项目上与我和他也不能理解的差异。我不明白为什么的价值越来越低,当我增加 OPERATIONS
.操作本身应该采取同样的时间(平均当然,并不完全相同的时间),不管多少次我执行它。
你可以告诉我,这实际上取决于行动本身,数据读取这些数据可能已经在缓和唠唠叨叨唠唠叨叨,但我认为这不是问题。在我的情况, myOperation
是读5000线的文字从CSV文件,分离的价值的 ;
并插入这些价值纳入一个数据结构。每次迭代,我摧毁的数据结构和初始化。
现在我想它,我也认为有一个问题,测量时间 clock_gettime()
, 也许我不是使用它的权利。我的意思是,看看这最后一个例子,在那里 OPERATIONS = 10000
.总时间是574133641ns,这将大约0,5s;那是不可能的,我花了几分钟,因为我不忍看着屏幕等着去吃点东西。
解决方案
您只需要改变你的diffTimeClock()
函数返回秒差的数量,作为double
:
double diffTimeClock(TimeClock start, TimeClock end) {
double diff;
diff = (end.tv_nsec - start.tv_nsec) / 1E9;
diff += (end.tv_sec - start.tv_sec);
return diff;
}
和在主程序变化dTime
到double
,并且printfs输出到花色:
printf(" - SEC (TOTAL): %f\n", dTime);
printf(" - SEC (OP): %f\n\n", dTime / OPERATIONS);
其他提示
像时钟进度类型外貌有两个字段,一个用于秒,一个用于纳秒。它没有任何意义,只是划分纳秒场操作的数量。你需要把总的时间。
如果您使用的是POSIX系统中存在的gettimeofday()函数可以使用这样的事情来获得以微秒当前时间:
long long timeInMicroseconds(void) {
struct timeval tv;
gettimeofday(&tv,NULL);
return (((long long)tv.tv_sec)*1000000)+tv.tv_usec;
}
之所以这样,是非常方便的是,为了计算出有多少你的功能了,你需要做的只是这一点:
long long start = timeInMicroseconds();
... do your task N times ...
printf("Total microseconds: %lld", timeInMicroseconds()-start);
所以,你不必应付两个整数,一个用秒和一个用微秒。加减时间将在一个明显的方式工作。
我通常使用的时间()function这一点。它显示了墙上的钟时间,但这真的是我关心的结束。
一个陷阱与性能测试操作系统可缓存文件系统有关的操作。因此,第二(和以后)的运行速度远远超过第一次运行。你通常需要测试可以操作和平均结果得到良好的结果的任何变化。有这么多的变量,这可以帮助你筛选出的噪音。