bestsource

예를 들어 목표-C에서 밀리초 단위로 정확한 시간을 얻으려면 어떻게 해야 합니다.

bestsource 2023. 6. 28. 21:51
반응형

예를 들어 목표-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(&currentTime, &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비트를 계산하는 방법은 다음과 같습니다.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

반응형