我正在使用unsigned long来收集性能数据,同时分析应用程序,如下所示
unsigned long time_taken = (unsigned long) ((finish_time_in_nano_sec - start_time_in_nano_sec)/1000);
将time_taken写入文件.对我的应用程序中调用的每个函数执行此操作.
现在应用程序执行后,有一个单独的程序读取上面的文件,并总结每个函数所需的时间,包括调用计数,如
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,datafile);
3)文件读取:fread(&time_taken,sizeof(long),1,datafile);
问题在于你的时间测量代码:
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);
Run Code Online (Sandbox Code Playgroud)
如果在start_time和之间交叉1秒的时钟边界finish_time,则减法可能会产生负值,然后将转换为非常大的正无符号值.
你还需要考虑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);
Run Code Online (Sandbox Code Playgroud)
(例如,时钟时间为23989032.452秒将表示为struct timespecwith .tv_sec = 23989032和.tv_nsec = 452000000)