예를 들어 목표-C에서 밀리초 단위로 정확한 시간을 얻으려면 어떻게 해야 합니다.
아주 정확하게 시간을 얻을 수 있는 쉬운 방법이 있습니까?
메서드 호출 사이의 지연 시간을 계산해야 합니다.좀 더 구체적으로, 나는 UIScrollView에서 스크롤 속도를 계산하고 싶습니다.
NSDate
리고그고.timeIntervalSince*
는 "A"를 합니다.NSTimeInterval
밀리초 미만의 정확도를 가진 두 배입니다. NSTimeInterval
초 단위이지만 더 높은 정밀도를 제공하기 위해 이중을 사용합니다.
밀리초 단위의 시간 정확도를 계산하기 위해 다음을 수행할 수 있습니다.
// Get a current time for where you want to start measuring from
NSDate *date = [NSDate date];
// do work...
// Find elapsed time and convert to milliseconds
// Use (-) modifier to conversion since receiver is earlier than now
double timePassed_ms = [date timeIntervalSinceNow] * -1000.0;
다음을 사용하여 이 구간을 계산하는 다른 많은 방법이 있습니다.NSDate
그고저리는수문보것추을다니천합는를서업▁document▁class▁foration다니▁and▁i의 수업 문서를 보는 것을 추천합니다.NSDate
NSDate Class Reference에 있습니다.
mach_absolute_time()
정확한 측정을 위해 사용할 수 있습니다.
http://developer.apple.com/qa/qa2004/qa1398.html 을 참조하십시오.
또한 사용할 수 있습니다.CACurrentMediaTime()
기본적으로 동일하지만 사용하기 쉬운 인터페이스를 사용합니다.
(참고: 이 답변은 2009년에 작성되었습니다.더 간단한 POSIX는 파벨 알렉세예프의 답변을 참조하십시오.clock_gettime()
최신 버전의 macOS 및 iOS에서 사용할 수 있는 인터페이스입니다.)
▁do를 하지 마십시오.NSDate
,CFAbsoluteTimeGetCurrent
또는gettimeofday
경과 시간을 측정합니다.이는 모두 시스템 클럭에 따라 달라집니다. NTP(Network Time Sync)는 클럭 업데이트(흔히 드리프트를 위해 조정됨), DST 조정, 윤초 등과 같은 다양한 이유로 인해 언제든지 변경될 수 있습니다.
즉, 다운로드 또는 업로드 속도를 측정하는 경우 실제 발생한 것과 상관없는 수치가 갑자기 급증하거나 감소합니다. 성능 테스트에서 이상한 잘못된 특이치가 발생합니다. 잘못된 기간이 지나면 수동 타이머가 트리거됩니다.시간은 거꾸로 갈 수도 있고, 부정적인 델타가 발생할 수도 있고, 무한 재귀나 데드 코드가 발생할 수도 있습니다. (네, 이 두 가지를 모두 수행했습니다.)
사용하다mach_absolute_time
커널이 부팅된 후 실제 초를 측정합니다.이 값은 단조롭게 증가하며(뒤로 이동하지 않음) 날짜 및 시간 설정의 영향을 받지 않습니다.함께 일하는 것이 고통스럽기 때문에, 여기 당신에게 주는 간단한 포장지가 있습니다.NSTimeInterval
s:
// LBClock.h
@interface LBClock : NSObject
+ (instancetype)sharedClock;
// since device boot or something. Monotonically increasing, unaffected by date and time settings
- (NSTimeInterval)absoluteTime;
- (NSTimeInterval)machAbsoluteToTimeInterval:(uint64_t)machAbsolute;
@end
// LBClock.m
#include <mach/mach.h>
#include <mach/mach_time.h>
@implementation LBClock
{
mach_timebase_info_data_t _clock_timebase;
}
+ (instancetype)sharedClock
{
static LBClock *g;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
g = [LBClock new];
});
return g;
}
- (id)init
{
if(!(self = [super init]))
return nil;
mach_timebase_info(&_clock_timebase);
return self;
}
- (NSTimeInterval)machAbsoluteToTimeInterval:(uint64_t)machAbsolute
{
uint64_t nanos = (machAbsolute * _clock_timebase.numer) / _clock_timebase.denom;
return nanos/1.0e9;
}
- (NSTimeInterval)absoluteTime
{
uint64_t machtime = mach_absolute_time();
return [self machAbsoluteToTimeInterval:machtime];
}
@end
CFAbsoluteTimeGetCurrent()
절대 시간을 a로 반환합니다.double
값입니다. 하지만 그 정밀도가 얼마인지는 모르겠습니다. 십 밀리초마다 또는 마이크로초마다 업데이트될 수도 있습니다. 저는 모릅니다.
는 용안함을 사용하지 입니다.mach_absolute_time()
이는 틱(업타임)을 사용하여 커널과 프로세서의 조합을 절대 시간 동안 쿼리하기 때문입니다.
사용할 내용:
CFAbsoluteTimeGetCurrent();
이 기능은 iOS와 OSX 소프트웨어 및 하드웨어의 차이를 수정하기 위해 최적화되었습니다.
썸씽 기키어
에 대비율의 몫mach_absolute_time()
그리고.AFAbsoluteTimeGetCurrent()
주위에 있습니다.
다음은 내 앱의 로그입니다.
최종 결과 시간은 다음과 같은 차이가 있습니다.CFAbsoluteTimeGetCurrent()
의
2012-03-19 21:46:35.609 Rest Counter[3776:707] First Time: 353900795.609040
2012-03-19 21:46:36.360 Rest Counter[3776:707] Second Time: 353900796.360177
2012-03-19 21:46:36.361 Rest Counter[3776:707] Final Result Time (difference): 0.751137
2012-03-19 21:46:36.363 Rest Counter[3776:707] Mach absolute time: 18027372
2012-03-19 21:46:36.365 Rest Counter[3776:707] Mach absolute time/final time: 24000113.153295
2012-03-19 21:46:36.367 Rest Counter[3776:707] -----------------------------------------------------
2012-03-19 21:46:43.074 Rest Counter[3776:707] First Time: 353900803.074637
2012-03-19 21:46:43.170 Rest Counter[3776:707] Second Time: 353900803.170256
2012-03-19 21:46:43.172 Rest Counter[3776:707] Final Result Time (difference): 0.095619
2012-03-19 21:46:43.173 Rest Counter[3776:707] Mach absolute time: 2294833
2012-03-19 21:46:43.175 Rest Counter[3776:707] Mach absolute time/final time: 23999753.727777
2012-03-19 21:46:43.177 Rest Counter[3776:707] -----------------------------------------------------
2012-03-19 21:46:46.499 Rest Counter[3776:707] First Time: 353900806.499199
2012-03-19 21:46:55.017 Rest Counter[3776:707] Second Time: 353900815.016985
2012-03-19 21:46:55.018 Rest Counter[3776:707] Final Result Time (difference): 8.517786
2012-03-19 21:46:55.020 Rest Counter[3776:707] Mach absolute time: 204426836
2012-03-19 21:46:55.022 Rest Counter[3776:707] Mach absolute time/final time: 23999996.639500
2012-03-19 21:46:55.024 Rest Counter[3776:707] -----------------------------------------------------
에 한 기능mach_absolute_time
짧은 측정에 좋습니다.
그러나 장시간 측정 시 중요한 주의 사항은 장치가 절전 모드에 있는 동안 똑딱거리는 소리가 나지 않는다는 것입니다.
부팅 후 시간을 얻는 기능이 있습니다.자는 동안 멈추지 않습니다.또한.gettimeofday
단조롭지는 않지만, 제 실험에서 시스템 시간이 변경되면 부팅 시간이 변경된다는 것을 항상 보았기 때문에 잘 작동해야 한다고 생각합니다.
func timeSinceBoot() -> TimeInterval
{
var bootTime = timeval()
var currentTime = timeval()
var timeZone = timezone()
let mib = UnsafeMutablePointer<Int32>.allocate(capacity: 2)
mib[0] = CTL_KERN
mib[1] = KERN_BOOTTIME
var size = MemoryLayout.size(ofValue: bootTime)
var timeSinceBoot = 0.0
gettimeofday(¤tTime, &timeZone)
if sysctl(mib, 2, &bootTime, &size, nil, 0) != -1 && bootTime.tv_sec != 0 {
timeSinceBoot = Double(currentTime.tv_sec - bootTime.tv_sec)
timeSinceBoot += Double(currentTime.tv_usec - bootTime.tv_usec) / 1000000.0
}
return timeSinceBoot
}
또한 iOS 10 및 macOS 10.12 이후에는 CLOCK_MONOTONIC을 사용할 수 있습니다.
if #available(OSX 10.12, *) {
var uptime = timespec()
if clock_gettime(CLOCK_MONOTONIC_RAW, &uptime) == 0 {
return Double(uptime.tv_sec) + Double(uptime.tv_nsec) / 1000000000.0
}
}
요약하자면:
Date.timeIntervalSinceReferenceDate
이 단조롭지 될 때 됩니다.CFAbsoluteTimeGetCurrent()
롭지 않은, 갈 도 있는, , 수갈아있음뒤로단▁not있음.CACurrentMediaTime()
장치가 절전 모드일 때 똑딱거리는 소리가 멈춥니다.timeSinceBoot()
안 , 롭지 않을 도 있습니다.CLOCK_MONOTONIC
10iOS 10부터 되는 잠을 않음,로움, 지원됨
또한 64비트를 계산하는 방법은 다음과 같습니다.NSNumber
Unix epoch로 초기화(밀리초)됩니다. 이렇게 하면 CoreData에 저장할 수 있습니다.저는 이런 식으로 날짜를 저장하는 시스템과 상호 작용하는 제 앱에 이것이 필요했습니다.
+ (NSNumber*) longUnixEpoch {
return [NSNumber numberWithLongLong:[[NSDate date] timeIntervalSince1970] * 1000];
}
#define CTTimeStart() NSDate * __date = [NSDate date]
#define CTTimeEnd(MSG) NSLog(MSG " %g",[__date timeIntervalSinceNow]*-1)
용도:
CTTimeStart();
...
CTTimeEnd(@"that was a long time:");
출력:
2013-08-23 15:34:39.558 App-Dev[21229:907] that was a long time: .0023
나는 이것이 오래된 것이라는 것을 알지만, 심지어 내가 그것을 다시 지나치고 있는 것을 발견했기 때문에, 나는 여기에 나만의 선택지를 제출해야겠다고 생각했습니다.
가장 좋은 방법은 다음에 대한 제 블로그 게시물을 확인하는 것입니다.목표 C의 타이밍: 스톱워치
기본적으로, 저는 매우 기본적인 방식으로 보는 것을 멈추지만 여러분이 다음을 하기만 하면 되도록 캡슐화된 수업을 작성했습니다.
[MMStopwatchARC start:@"My Timer"];
// your work here ...
[MMStopwatchARC stop:@"My Timer"];
그러면 다음과 같은 결과를 얻을 수 있습니다.
MyApp[4090:15203] -> Stopwatch: [My Timer] runtime: [0.029]
로그에...
다시 말씀드리지만, 제 게시물을 조금 더 확인하거나 MMStopwatch.zip에서 다운로드하십시오.
NSDate를 사용하면 1970년 1월 1일 이후 현재 시간을 밀리초 단위로 얻을 수 있습니다.
- (double)currentTimeInMilliseconds {
NSDate *date = [NSDate date];
return [date timeIntervalSince1970]*1000;
}
그들을 위해 우리는 @Jeff Thompson의 답변의 Swift 버전이 필요합니다.
// Get a current time for where you want to start measuring from
var date = NSDate()
// do work...
// Find elapsed time and convert to milliseconds
// Use (-) modifier to conversion since receiver is earlier than now
var timePassed_ms: Double = date.timeIntervalSinceNow * -1000.0
이것이 당신에게 도움이 되길 바랍니다.
언급URL : https://stackoverflow.com/questions/889380/how-can-i-get-a-precise-time-for-example-in-milliseconds-in-objective-c
'bestsource' 카테고리의 다른 글
UIScrollView 스크롤이 완료되었을 때 감지하는 방법 (0) | 2023.06.28 |
---|---|
Firebase Cloud Firestore에서 문서에 하위 컬렉션을 추가하는 방법 (0) | 2023.06.28 |
그의 이름과 열 참조를 사용하여 Excel 2010 테이블을 루프하려면 어떻게 해야 합니까? (0) | 2023.06.28 |
오라클에서 쉼표로 구분된 값을 행으로 변환하는 방법은 무엇입니까? (0) | 2023.06.28 |
각 그룹에 대한 상위 결과 가져오기(Oracle) (0) | 2023.06.28 |