예를 들어 목표-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의 수업 문서를 보는 것을 추천합니다.NSDateNSDate 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커널이 부팅된 후 실제 초를 측정합니다.이 값은 단조롭게 증가하며(뒤로 이동하지 않음) 날짜 및 시간 설정의 영향을 받지 않습니다.함께 일하는 것이 고통스럽기 때문에, 여기 당신에게 주는 간단한 포장지가 있습니다.NSTimeIntervals:
// 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_MONOTONIC10iOS 10부터 되는 잠을 않음,로움, 지원됨
또한 64비트를 계산하는 방법은 다음과 같습니다.NSNumberUnix 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 |