嗨:在iPhone应用程序中,我使用了一个库(C++),它在计算完成时异步地进行回调。 现在我想测量花费的时间 - 包括调用库的方法 - 直到回调完成。有没有可能通过Apple的Instruments应用程序来做到这一点?什么是最佳实践?库调用和回调之间的测量时间
2
A
回答
8
在过去,我使用以下方法进行网络调用,我不得不优化 - 尽管起初看起来有些复杂,但它确实给出了我所见过的最准确的时间。
uint64_t time_a = mach_absolute_time();
// do stuff
uint64_t time_b = mach_absolute_time();
[self logTime:(time_b-time_a)];
- (void) logTime:(uint64_t)machTime {
static double timeScaleSeconds = 0.0;
if (timeScaleSeconds == 0.0) {
mach_timebase_info_data_t timebaseInfo;
if (mach_timebase_info(&timebaseInfo) == KERN_SUCCESS) {
double timeScaleMicroSeconds = ((double) timebaseInfo.numer/(double) timebaseInfo.denom)/1000;
timeScaleSeconds = timeScaleMicroSeconds/1000000;
}
}
NSLog(@"%g seconds", timeScaleSeconds*machTime);
}
0
我写了一个C++类来包装mach_absolute_time调用。在测量时间差的事件开始/停止时,这可以方便地在代码中进行喷洒。
如果您想在类中使用它来执行计时(在调用之间)或基于状态的行为(在计时器到达X后执行某些操作),它也可以很好地工作。
StopWatch.h
class StopWatch
{
private:
uint64 _start;
uint64 _stop;
uint64 _elapsed;
public:
void Start();
void Stop();
void Reset();
void Continue();
double GetSeconds();
};
StopWatch.cpp
#include "Stopwatch.h"
#include <mach/mach_time.h>
void StopWatch::Start()
{
_stop = 0;
_elapsed = 0;
_start = mach_absolute_time();
}
void StopWatch::Stop()
{
_stop = mach_absolute_time();
if(_start > 0)
{
if(_stop > _start)
{
_elapsed = _stop - _start;
}
}
}
void StopWatch::Reset()
{
_start = 0;
_stop = 0;
_elapsed = 0;
}
void StopWatch::Continue()
{
_elapsed = 0;
_stop = 0;
}
double StopWatch::GetSeconds()
{
double elapsedSeconds = 0.0;
uint64 elapsedTimeNano = 0;
if(_elapsed > 0)
{ // Stopped
mach_timebase_info_data_t timeBaseInfo;
mach_timebase_info(&timeBaseInfo);
elapsedTimeNano = _elapsed * timeBaseInfo.numer/timeBaseInfo.denom;
elapsedSeconds = elapsedTimeNano * 1.0E-9;
}
else if(_start > 0)
{ // Running or Continued
uint64_t elapsedTemp;
uint64_t stopTemp = mach_absolute_time();
if(stopTemp > _start)
{
elapsedTemp = stopTemp - _start;
}
else
{
elapsedTemp = 0;
}
mach_timebase_info_data_t timeBaseInfo;
mach_timebase_info(&timeBaseInfo);
elapsedTimeNano = elapsedTemp * timeBaseInfo.numer/timeBaseInfo.denom;
elapsedSeconds = elapsedTimeNano * 1.0E-9;
}
return elapsedSeconds;
}
相关问题
- 1. 函数调用和回调之间的C++度量时间
- 2. after_initialize和before_create之间回调
- 3. 测量AJAX调用的处理时间
- 4. 方法调用之间的时间差
- 5. Javascript回调时间
- 6. 两点之间的时间测量
- 7. 在Python和C之间实现回调
- 8. collection.find与回调和不回调之间有什么区别?
- 9. 的jquery,javascript和回调时间
- 10. 如何测量调用WCF Webservice时所用的时间?
- 11. 更改音频核心中回调之间的通话时间
- 12. 如何减少数据库调用时间和数量(Rails)?
- 13. 两次方法调用之间的时间间隔
- 14. 函数调用与requestAnimationFrame之间的时间间隔变化
- 15. 如何测量点击和释放之间的JavaScript时间?
- 16. 测量keydown和keyup事件之间的时间
- 17. 调用和通话之间的延迟
- 18. Linux和Solaris之间的RPC调用
- 19. 服务器日志和我的客户端之间的SOAP调用执行时间测量差异
- 20. Javascript和时间,特别是与回调
- 21. node.js中的回调之间的关系
- 22. 打印调用之间的Python间距
- 23. JQuery FadeOut()回调时间
- 24. 定时器C#。启动,停止,并得到调用之间的时间量
- 25. Ruby on Rails:如何让ActiveRecord回调加载回调之间的共享变量
- 26. Objective-C iOS之间的回调函数
- 27. 线程之间的回调同步
- 28. WCF两个服务之间的回调
- 29. 版本和调试模式之间编译时间的差异
- 30. Rx调用PublishSubject.onNext()和接收它之间的时间间隔很长