C++ 性能分析器:如何使用unsignedlong以微秒为单位测量时间?
我使用unsigned long收集性能数据,同时分析应用程序,如下所示C++ 性能分析器:如何使用unsignedlong以微秒为单位测量时间?,c++,c,C++,C,我使用unsigned long收集性能数据,同时分析应用程序,如下所示 unsigned long time_take=(unsigned long)((完成时间以秒计-开始时间以秒计)/1000) 写入文件所用的时间。对我的应用程序中调用的每个函数都执行此操作 现在,在应用程序执行之后,让一个单独的程序读取上述文件,并总结每个函数所花费的时间,包括调用计数,例如 func\u name aggregate\u time call\u counts 我遇到的问题是,对于某些函数,aggrega
unsigned long time_take=(unsigned long)((完成时间以秒计-开始时间以秒计)/1000)代码>
func\u name aggregate\u time call\u counts
我遇到的问题是,对于某些函数,aggregate_time字段是一个20位的值,即无符号long可以容纳的最大值。这不可能是真的,因为我以微秒为单位测量时间,并且运行我的应用程序的时间不会超过20秒。那么它怎么可能是一个20位数的值呢
您是否看到步骤1、2和3中的错误
问候,,
克里希纳
编辑:
1) 时间测量:
时钟获取时间(时钟实时和开始时间);
时钟获取时间(时钟实时和完成时间);
无符号长时间=无符号长时间((finish\u time.tv\u nsec-art\u time.tv\u nsec)/1000)
2) 文件写入:
fwrite(花费的时间和长度,sizeof(无符号长),1,数据文件)
3) 文件读取:
fread(所花费的时间和长度,sizeof(long),1,数据文件) 问题不在您显示的代码中-尽管以纳秒为单位了解时间类型会很有趣 因此,问题在于您没有显示的代码:
- 将数据写入文件
- 从文件中读取数据
- 以纳秒为单位获取时间
- 以微秒为单位处理时间
SetProcessAffinityMask
,可以很容易地解决这个问题
编辑:小心你如何测量时间。大多数时候API的分辨率都很糟糕,所以使用它们测量小的间隔是没有意义的。尝试显式使用RDTSC
最重要的是:文件I/O是一个非常慢的函数,它可以完全破坏有用的信息。例如,如果同时对调用者和被调用者执行测量,并且被调用者将结果写入文件,则为调用者测量的时间将包括在
fwrite
中花费的时间。还要监视每次写入,以便您可以看到在那里花费了多少时间(为了避免递归,您可以保存一次写入所花费的时间,并将其记录到下一次写入中)。问题在于您的时间度量代码:
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\u time
和finish\u 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=452000000
表示为struct timespec
)是否有一个工具可以为您这样做?也许你的完成时间和开始时间颠倒了。有什么原因你不能使用,例如,gprof
(它就是这样做的)或valgrind/callgrind(它是一个更好的分析工具)?嗨,谢谢。对由于某种原因,我无法使用它们。甚至还有针式探针,但我是根据第一原理来做的。1)时间测量:时钟获取时间(时钟实时和开始时间);时钟获取时间(时钟实时和完成时间);无符号长时间=无符号长时间((finish\u time.tv\u nsec-start\u time.tv\u nsec)/1000);2)文件写入:fwrite(&time_take,sizeof(unsigned long),1,datafile);3) 文件读取:fread(&time_take,sizeof(long),1,数据文件);您好,很抱歉上面的内容没有缩进就乱七八糟了。。。。我不知道如何在提供的文本框中添加格式…如果同时使用gettimeofday()函数,我也会遇到同样的问题。此外,我不是在测量函数之间的时间,我的开始和结束时间是每个函数的开始和结束时间。。。因此,我猜开始时间在一个CPU上执行,而完成时间在另一个CPU上执行的可能性较小或不存在。@Kris:您必须在main()
中添加一个API调用来检查它。我无法控制main。。。我的东西就像一个共享对象,它“劫持”了我的可执行文件发出的OpenGL API调用(我只按原样运行它…甚至不能重新编译…只需使用LD_PRELOAD将可执行文件链接到我的共享对象并运行!!)你可以使用process explorer更改关联性。嗨,Ruslik,我找到了你的“小心你如何测量时间。大多数时候API的分辨率都很糟糕,所以使用它们测量小的间隔是没有意义的。尝试明确地使用RDTSC。“对我也怀疑的事情发表评论。。。但我不知道是否有出路。。。而RDTSC本身也有很多问题。。。对于真正的问题是什么有点不知所措。。。是否使用错误的API来测量时间,是否在写入/读取文件时出错???Oops。。。精彩的观察!!谢谢这个。。。真不好意思我错过了这个。。。这个答案你想要多少票?:-)但是为什么你只把电视秒的值乘以1000呢?应该是1000000吧?@Kris Retro Virus:你应该选择这个作为答案(这样做甚至会给你几分)。哦,好的。我以为是电视