목표-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_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의 각 모델에 대해 상수일 수도 있다고 생각합니다(그러나 잘 모르겠습니다).내 아이폰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
'programing' 카테고리의 다른 글
엑셀에서 큰따옴표를 포함하는 문자열이나 수식을 만드는 방법은 무엇입니까? (0) | 2023.05.05 |
---|---|
셀의 문자열 값을 사용하여 동일한 이름의 워크시트에 액세스 (0) | 2023.05.05 |
OrderedDict는 Python 3.7에서 중복됩니까? (0) | 2023.05.05 |
상위 100% 선택을 사용하는 이유는 무엇입니까? (0) | 2023.05.05 |
파이썬의 for 루프에서 "통과"와 "계속" 사이에 차이가 있습니까? (0) | 2023.05.05 |