Получение времени, прошедшего в Objective-C



Мне нужно получить время, прошедшее между двумя событиями, например, появление UIView и первой реакции пользователя.



Как я могу достичь этого в Objective-C?

467   7  

7 ответов:

NSDate *start = [NSDate date];
// do stuff...
NSTimeInterval timeInterval = [start timeIntervalSinceNow];

timeInterval - это разница между start и now, в секундах,с точностью до миллисекунды.

вы не должны полагаться на [NSDate date] для целей синхронизации, так как он может более или менее сообщить о прошедшем времени. Есть даже случаи, когда ваш компьютер будет, Казалось бы, путешествие во времени, так как прошедшее время будет отрицательным! (Например, если часы двигались назад во время синхронизации.)

согласно арии Хагиги в лекции "расширенное распознавание жестов iOS"зима 2013 Стэнфорд iOS курс (34:00), вы должны использовать CACurrentMediaTime() если вам нужен точный временной интервал.

Цель-C:

#import <QuartzCore/QuartzCore.h>
CFTimeInterval startTime = CACurrentMediaTime();
// perform some action
CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime;

Swift:

let startTime = CACurrentMediaTime()
// perform some action
let elapsedTime = CACurrentMediaTime() - startTime

причина в том, что [NSDate date] синхронизация на сервере, так что это может привести к "время синхронизации икоты", которые могут привести к очень трудно отслеживать ошибки. CACurrentMediaTime(), С другой стороны, это время устройства, которое не меняется с этими сетевыми синхронизациями.

вам понадобится добавить the QuartzCore framework настройки вашей цели.

использовать timeIntervalSinceDate метод

NSTimeInterval secondsElapsed = [secondDate timeIntervalSinceDate:firstDate];

NSTimeInterval - просто double, определить в NSDate такой:

typedef double NSTimeInterval;

для тех, кто приходит сюда в поисках реализации getTickCount () для iOS, вот мой после объединения различных источников:

#include <mach/mach.h>
#include <mach/mach_time.h>

uint64_t getTickCount(void)
{
    static mach_timebase_info_data_t sTimebaseInfo;
    uint64_t machTime = mach_absolute_time();

    // Convert to nanoseconds - if this is the first time we've run, get the timebase.
    if (sTimebaseInfo.denom == 0 )
    {
        (void) mach_timebase_info(&sTimebaseInfo);
    }

    // Convert the mach time to milliseconds
    uint64_t millis = ((machTime / 1000000) * sTimebaseInfo.numer) / sTimebaseInfo.denom;
    return millis;
}

для измерения времени percise (например, GetTickCount), также взгляните на mach_absolute_time и это Apple Q&A:http://developer.apple.com/qa/qa2004/qa1398.html.

используйте функцию timeIntervalSince1970 класса NSDate, как показано ниже:

double start = [startDate timeIntervalSince1970];
double end = [endDate timeIntervalSince1970];
double difference = end - start;

в основном, это то, что я использую для сравнения разницы в секундах между 2 разными датами. также проверьте эту ссылку здесь

остальные ответы верны (с оговоркой*). Я добавляю этот ответ просто, чтобы показать пример использования:

- (void)getYourAffairsInOrder
{
    NSDate* methodStart = [NSDate date];  // Capture start time.

    // … Do some work …

    NSLog(@"DEBUG Method %s ran. Elapsed: %f seconds.", __func__, -([methodStart timeIntervalSinceNow]));  // Calculate and report elapsed time.
}

на консоли отладчика вы видите что-то вроде этого:

DEBUG Method '-[XMAppDelegate getYourAffairsInOrder]' ran. Elapsed: 0.033827 seconds.

*предостережение: как уже упоминалось, используйте NSDate для расчета затраченного времени только для случайных целей. Одной из таких целей может быть общее тестирование, грубое профилирование, где вам просто нужно приблизительное представление о том, сколько времени занимает метод.

риск заключается в том, что устройства текущая настройка времени часов может измениться в любой момент из-за синхронизации сетевых часов. Так что NSDate время может прыгать вперед или назад в любой момент.

Comments

    Ничего не найдено.