gpt4 book ai didi

c++ - 性能分析器 : How to use unsigned long to measure time in microseconds?

转载 作者:太空狗 更新时间:2023-10-29 20:31:22 24 4
gpt4 key购买 nike

我正在使用 unsigned long 来收集性能数据,同时按如下方式分析应用程序

  1. unsigned long time_taken = (unsigned long) ((finish_time_in_nano_sec - start_time_in_nano_sec)/1000);

  2. 将 time_taken 写入文件。对我的应用中调用的每个函数执行此操作。

  3. 现在在应用程序执行后,让一个单独的程序读取上述文件并总结每个函数所花费的时间,包括调用次数,例如

func_name aggregate_time call_counts

我遇到的问题是,对于某些函数,aggregate_time 字段是一个 20 位数的值,即 unsigned long 可以容纳的最大值。这不可能是真的,因为我以微秒为单位测量时间,并且我的应用程序运行时间不会超过 20 秒。它怎么可能是 20 位数的值?

您看到步骤 1、2 和 3 中的错误了吗?

问候,奎师那

编辑:

1) 时间测量: clock_gettime(CLOCK_REALTIME, &start_time); clock_gettime(CLOCK_REALTIME, &finish_time); unsigned long time_taken = (unsigned long)((finish_time.tv_nsec - art_time.tv_nsec)/1000);

2) 文件写入: fwrite(&time_taken, sizeof(unsigned long), 1, 数据文件);

3) 文件读取: fread(&time_taken, sizeof(long), 1, 数据文件);

最佳答案

问题出在你的时间测量代码中:

clock_gettime(CLOCK_REALTIME, &start_time);
clock_gettime(CLOCK_REALTIME, &finish_time);
unsigned long time_taken = (unsigned long)((finish_time.tv_nsec - start_time.tv_nsec)/1000);

如果在 start_timefinish_time 之间跨越 1 秒时钟边界,那么您的减法可能会产生负值,然后将转换为非常大的正无符号值。

您还需要考虑时代的 tv_sec 成员:

unsigned long time_taken;
time_taken = (unsigned long)((finish_time.tv_sec - start_time.tv_sec) * 1000000);
time_taken += (unsigned long)(finish_time.tv_nsec / 1000);
time_taken -= (unsigned long)(start_time.tv_nsec / 1000);

(例如,23989032.452 秒的时钟时间将表示为具有 .tv_sec = 23989032.tv_nsec = 452000000struct timespec)

关于c++ - 性能分析器 : How to use unsigned long to measure time in microseconds?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4466379/

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