Измерьте время, которое запрос занимает на iPad - PullRequest
2 голосов
/ 18 февраля 2012

Я пытаюсь увидеть, где мои дорогие запросы, и хочу измерить, является ли это узким местом запрос или что-то еще.А также оцените, выполняются ли некоторые запросы быстрее, чем другие в нашем приложении.Мне было интересно, как я могу сделать это с помощью инструментов.Я вижу, что есть инструмент для профилирования времени, и мне было интересно, смогу ли я использовать это.

Я попытался запустить Time Profiler, нажав на кнопку, которая представляет мой viewController, который обращается к базе данных.Я не вижу сам вызов sql, и мне было интересно, как лучше измерить время, которое метод занимает от начала до конца.Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 января 2014

Для нахождения разницы во времени между вызовами я обычно использую класс StopWatch, который использует машинное время (по крайней мере, миллисекунды, может быть, точность микросекунд).

Эта версия разработана специально для autorelease и target-c. У него есть метод stopWithContext:, который также регистрирует сообщение со временем. Это удобно для запуска / остановки измерений в нескольких функциях. Адаптируйте его так, как считаете нужным.

У меня также есть версия на С ++, если это необходимо. [Вы можете найти версию 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.

Пример функции A (синхронизация вызова выполнения)

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

   ... do stuff

   [stopWatch StopWithContext:[NSString stringWithFormat:@"Created %d Records",[records count]]];
}
0 голосов
/ 18 февраля 2012

Почему вы не печатаете в консоли время, когда оно начинается и когда заканчивается.Я делаю это на многих языках, таких как iOS / Java [Android] / PHP.Отладка плагинов раз

Надеюсь, это поможет

...