programing

목표-C에서 시간 경과

newsource 2023. 5. 5. 09:45

목표-C에서 시간 경과

예를 들어 UIView의 모양과 사용자의 첫 번째 반응과 같은 두 이벤트 사이에 경과된 시간을 얻어야 합니다.

목표-C에서 어떻게 달성할 수 있습니까?

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

timeInterval밀리초 미만의 정밀도로 시작과 현재 사이의 차이(초)입니다.

에 의존해서는 안 됩니다.[NSDate date]경과 시간을 초과 또는 과소 보고할 수 있으므로 타이밍 목적으로 사용할 수 있습니다.경과된 시간이 음수이므로 컴퓨터가 시간을 이동하는 것처럼 보이는 경우도 있습니다! (예: 시간을 측정하는 동안 시계가 뒤로 이동한 경우)

2013년 겨울 스탠퍼드 iOS 과정의 "고급 iOS 제스처 인식" 강의의 아리아 하기에 따르면(34:00), 정확한 시간 간격이 필요하면 사용해야 합니다.

목표-C:

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

스위프트:

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

그 이유는[NSDate date]서버에서 동기화되므로 "시간 동기화 오류"가 발생하여 추적하기 매우 어려운 버그로 이어질 수 있습니다. CACurrentMediaTime()반면에 는 이러한 네트워크 동기화와 함께 변경되지 않는 장치 시간입니다.

QuartzCore 프레임워크를 대상 설정에 추가해야 합니다.

참고: 다음과 같은 다른 API가 있습니다.clock_gettime_nsec_np그것도 효과가 있을 수 있습니다.

사용timeIntervalSinceDate방법

NSTimeInterval secondsElapsed = [secondDate timeIntervalSinceDate:firstDate];

NSTimeInterval그냥.double에 정의를 내리다.NSDate다음과 같이:

typedef double NSTimeInterval;

iOS용 getTickCount() 구현을 찾고 있는 사람들을 위해, 여기 다양한 소스를 종합한 후 제 것입니다.

이전에 이 코드에 버그가 있었습니다(처음에는 1000000으로 나누었습니다). 이로 인해 iPhone 6의 출력이 정량화되었습니다(아마 iPhone 4/etc에서는 문제가 아니었거나 전혀 눈치채지 못했습니다).이 분할을 먼저 수행하지 않으면 타임베이스의 분자가 상당히 클 경우 오버플로의 위험이 있습니다.궁금한 사람이 있다면, 여기에 훨씬 더 많은 정보가 있는 링크가 있습니다: https://stackoverflow.com/a/23378064/588476 .

그 정보에 비추어 볼 때, 아마도 애플의 기능을 사용하는 것이 더 안전할 것입니다.CACurrentMediaTime!

저는 또한 벤치마크를 했습니다.mach_timebase_infoiPhone 6에서 호출하고 약 19ns가 소요되므로 해당 호출의 출력을 캐싱하는 (스레드세이프가 아님) 코드를 제거했습니다.

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

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

    // Convert to milliseconds
    mach_timebase_info(&sTimebaseInfo);
    machTime *= sTimebaseInfo.numer;
    machTime /= sTimebaseInfo.denom;
    machTime /= 1000000; // convert from nanoseconds to milliseconds

    return machTime;
}

타임베이스 호출의 출력에 따라 잠재적인 오버플로 위험을 인식해야 합니다.iPhone의 각 모델에 대해 상수일 수도 있다고 생각합니다(그러나 잘 모르겠습니다).내 아이폰6에는 그것이 있었습니다.125/3.

다을사는솔루션을 사용한 CACurrentMediaTime()매우 사소한 것입니다.

uint64_t getTickCount(void)
{
    double ret = CACurrentMediaTime();
    return ret * 1000;
}

GetTickCount와 같은 Percise 시간 측정의 경우 mach_absolute_time과 Apple Q&A: http://developer.apple.com/qa/qa2004/qa1398.html 도 살펴봅니다.

시간을 보다Interval1970 이후 NSDate 클래스의 함수는 다음과 같습니다.

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

기본적으로, 이것은 제가 두 개의 다른 날짜 사이의 차이를 비교하기 위해 사용하는 것입니다.또한 이 링크를 여기서 확인합니다.

다른 답은 정답입니다(주의 사항 포함*).사용 예를 보여주기 위해 이 답변을 추가합니다.

- (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시간은 어떤 순간에도 앞으로 또는 뒤로 뛸 수 있습니다.

언급URL : https://stackoverflow.com/questions/741830/getting-time-elapsed-in-objective-c