gpt4 book ai didi

c - 测量代码块执行时间 N 倍的问题

转载 作者:太空宇宙 更新时间:2023-11-04 07:42:06 24 4
gpt4 key购买 nike

编辑: 在写完这篇解释每一个小细节的长篇文章后,我才发现我的问题......如果有人能给我一个很好的答案,告诉我我做错了什么以及如何以秒为单位获得执行时间(使用浮点数小数点后 5 位左右),我将其标记为已接受。提示:问题在于我如何解释 clock_getttime() 手册页。

你好,

假设我有一个名为 myOperation 的函数,我需要测量它的执行时间。为了衡量它,我使用了 clock_gettime(),因为它在其中一条评论中被推荐为 here

我的老师建议我们测量它的 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 函数来自这个 blog post 。我用 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

现在,我不是数学天才,实际上远非如此,但这对我来说没有任何意义。我已经和一个和我一起做这个项目的 friend 讨论过这个问题,他也无法理解这些差异。我不明白为什么当我增加 OPERATIONS 时值会越来越低。无论我执行多少次,操作本身都应该花费相同的时间(当然,平均而言,不是完全相同的时间)。

您可以告诉我,这实际上取决于操作本身、正在读取的数据以及某些数据可能已经在缓存中,等等,但我认为这不是问题所在。就我而言, myOperation 正在从 CSV 文件中读取 5000 行文本,通过 ; 分隔值并将这些值插入到数据结构中。对于每次迭代,我都会破坏数据结构并再次对其进行初始化。

现在我想起来了,我也认为 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;
}

并在主程序更改 dTimedouble ,以及适合的 printfs:
printf("   - SEC (TOTAL): %f\n", dTime);
printf(" - SEC (OP): %f\n\n", dTime / OPERATIONS);

关于c - 测量代码块执行时间 N 倍的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2822022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com