编辑:在写完这篇解释每一个小细节的长篇文章后,我才发现我的问题......如果有人能给我一个很好的答案,说明我做错了什么以及如何以秒为单位获得执行时间(使用带有 5 的浮点数小数位左右),我将其标记为已接受。提示:问题在于我如何解释 clock_getttime() 手册页。
你好,
假设我有一个名为的函数myOperation
,我需要测量它的执行时间。为了测量它,我正在使用其中一条评论clock_gettime()
中推荐的方法。
我的老师建议我们测量它N
的时间,这样我们就可以获得最终报告的平均值、标准差和中位数。他还建议我们执行myOperation
M
时间,而不仅仅是一个。如果myOperation
是一个非常快的操作,测量它M
的时间可以让我们了解它所花费的“实时”;导致正在使用的时钟可能没有测量此类操作所需的精度。因此,myOperation
只执行一次或M
多次真的取决于操作本身是否需要足够长的时间来满足我们使用的时钟精度。
我在处理那次M
执行时遇到了麻烦。增加M
会降低(很多)最终平均值。这对我来说没有意义。就像这样,从 A 点到 B 点平均需要 3 到 5 秒。但是从 A 点到 B 点再回到 A 点需要 5 次(这就是 10 次,因为 A 到 B 点与 B 点相同)到 A) 然后你测量它。除了除以 10,你得到的平均值应该与你从 A 点到 B 点的平均时间相同,也就是 3 到 5 秒。
这就是我希望我的代码执行的操作,但它不起作用。如果我不断增加从 A 到 B 再返回 A 的次数,每次的平均值都会越来越低,这对我来说毫无意义。
足够的理论,这是我的代码:
#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
是从 CSV 文件中读取 5000 行文本,通过分隔值;
并将这些值插入到数据结构中。对于每次迭代,我都会破坏数据结构并再次对其进行初始化。
现在我想起来了,我也认为用 测量时间有问题clock_gettime()
,也许我没有正确使用它。我的意思是,看最后一个例子,其中OPERATIONS = 10000
. 总共花费了 574133641ns,大概是 0.5s;那是不可能的,花了几分钟,因为我无法忍受看着屏幕等待并去吃东西。