衡量查询在iPad上的时间

时间:2012-02-18 04:44:14

标签: iphone instruments

我正在尝试查看我的昂贵查询的位置,并且想要测量它是否是瓶颈或其他内容的查询。并且还测量某些查询是否比我们的应用程序中的其他查询更快。我想知道如何用仪器做到这一点。我看到有一个时间分析器工具,并想知道我是否可以使用它。

我尝试运行Time Profiler,单击显示访问数据库的viewController的按钮。我没有看到我自己的SQL调用,并且想知道测量方法从开始到结束所用时间的最佳方法。感谢。

2 个答案:

答案 0 :(得分:0)

为什么不在控制台中打印它开始和完成时的时间。我在iOS / Java [Android] / PHP等许多语言中都这样做。调试插件时间

我希望它有所帮助

答案 1 :(得分:0)

为了找到调用之间的时差,我通常使用一个使用机器时间的StopWatch类(至少毫秒,也许是微秒精度)。

此版本专为autorelease和objective-c设计。它有一个方法stopWithContext:,它还会记录带有时间的消息。这对于多个功能中的启动/停止测量非常方便。如你所愿,定制它。

如果需要,我也有c ++版本。 [你可以在这里找到c ++版本] [1]。

<强> StopWatch.h

#import <Foundation/Foundation.h>


@interface StopWatch : NSObject 
{
    uint64_t _start;
    uint64_t _stop;
    uint64_t _elapsed;
}

-(void) Start;
-(void) Stop;
-(void) StopWithContext:(NSString*) context;
-(double) seconds;
-(NSString*) description;
+(StopWatch*) stopWatch;
-(StopWatch*) init;
@end

<强> StopWatch.m

#import "StopWatch.h"
#include <mach/mach_time.h>

@implementation StopWatch

-(void) Start
{
    _stop = 0;
    _elapsed = 0;
    _start = mach_absolute_time();
}
-(void) Stop
{
    _stop = mach_absolute_time();   
    if(_stop > _start)
    {
        _elapsed = _stop - _start;
    }
    else 
    {
        _elapsed = 0;
    }
    _start = mach_absolute_time();
}

-(void) StopWithContext:(NSString*) context
{
    _stop = mach_absolute_time();   
    if(_stop > _start)
    {
        _elapsed = _stop - _start;
    }
    else 
    {
        _elapsed = 0;
    }
    NSLog([NSString stringWithFormat:@"[%@] Stopped at %f",context,[self seconds]]);

    _start = mach_absolute_time();
}


-(double) seconds
{
    if(_elapsed > 0)
    {
        uint64_t elapsedTimeNano = 0;

        mach_timebase_info_data_t timeBaseInfo;
        mach_timebase_info(&timeBaseInfo);
        elapsedTimeNano = _elapsed * timeBaseInfo.numer / timeBaseInfo.denom;
        double elapsedSeconds = elapsedTimeNano * 1.0E-9;
        return elapsedSeconds;
    }
    return 0.0;
}
-(NSString*) description
{
    return [NSString stringWithFormat:@"%f secs.",[self seconds]];
}
+(StopWatch*) stopWatch
{
    StopWatch* obj = [[[StopWatch alloc] init] autorelease];
    return obj;
}
-(StopWatch*) init
{
    [super   init];
    return self;
}

@end

该类有一个静态stopWatch方法,它返回一个自动释放的对象。

致电start后,请使用seconds方法获取已用时间。再次致电start以重新启动它。或stop阻止它。您仍然可以在致电seconds后随时阅读时间(致电stop)。

功能中的示例(执行的定时调用)

-(void)SomeFunc
{
   StopWatch* stopWatch = [StopWatch stopWatch];
   [stopWatch Start];

   ... do stuff

   [stopWatch StopWithContext:[NSString stringWithFormat:@"Created %d Records",[records count]]];
}