예를 들어 UIView의 모양과 사용자의 첫 번째 반응과 같은 두 이벤트 사이에 경과 된 시간을 가져와야합니다.
Objective-C에서 어떻게 달성 할 수 있습니까?
답변
NSDate *start = [NSDate date];
// do stuff...
NSTimeInterval timeInterval = [start timeIntervalSinceNow];
timeInterval
밀리 초 미만의 정밀도로 시작과 지금의 차이 (초)입니다.
답변
[NSDate date]
경과 시간을 과도하거나 과소보고 할 수 있으므로 타이밍 목적 에 의존해서는 안됩니다 . 경과 시간이 음수이기 때문에 컴퓨터가 시간 여행을하는 것처럼 보이는 경우도 있습니다! (예 : 타이밍 중에 시계가 뒤로 이동 한 경우)
Winter 2013 Stanford iOS 과정 (34:00) 의 “Advanced iOS Gesture Recognition”강의에서 Aria Haghighi에 따르면 CACurrentMediaTime()
정확한 시간 간격이 필요한 경우 사용해야 합니다.
목표 -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 프레임 워크를 대상의 설정.
답변
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
그 정보에 비추어 볼 때 Apple의 기능을 사용하는 것이 더 안전 할 수 있습니다 CACurrentMediaTime
!
또한 mach_timebase_info
호출 을 벤치마킹했으며 iPhone 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의 각 모델에 대해 상수 일 수 있다고 생각합니다 (그러나 모릅니다). 내 iPhone 6에서는 125/3
.
사용하는 솔루션 CACurrentMediaTime()
은 매우 간단합니다.
uint64_t getTickCount(void)
{
double ret = CACurrentMediaTime();
return ret * 1000;
}
답변
Percise 시간 측정 (예 : GetTickCount)의 경우 mach_absolute_time 및이 Apple Q & A : http://developer.apple.com/qa/qa2004/qa1398.html 도 살펴보십시오 .
답변
답변
다른 답변은 정확합니다 (주의 *). 예제 사용을 보여주기 위해이 답변을 추가합니다.
- (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
시간은 언제든지 앞뒤로 이동할 수 있습니다.