[FIXED] Dispatch_time-Berechnungen schlagen auf Apple Silicon fehl

Ausgabe

Ich habe Objective-C-Code, der auf Intel-Macs funktioniert, aber auf Macs mit dem M1-Chip fehlschlägt.

dispatch_time_t now = dispatch_time(DISPATCH_TIME_NOW, 0);
dispatch_time_t delta = (uint64_t)(1 * NSEC_PER_SEC);
dispatch_time_t when = dispatch_time(now, delta);

NSLog(@"now: %llu", now);
NSLog(@"delta: %llu", delta);
NSLog(@"when: %llu", when);
NSLog(@"real delta: %llu", when-now);

Es wird ungefähr so ​​​​ausgedruckt:

now: 1272914827933
delta: 1000000000
when: 1272938827933
real delta: 24000000

1272914827933+ 1000000000= 1273914827933, NICHT 1272938827933. Warum zum Teufel schlägt das fehl und nur auf einigen Macs?

Bearbeiten: Dies ist auch defekt, wenn es auf einem tatsächlichen iPhone-Gerät ausgeführt wird. Erstellen Sie einfach ein neues Xcode-Projekt mit Obj-C, fügen Sie den Code in AppDelegate ein und führen Sie es auf Ihrem Telefon aus.

Lösung

Das zweite Argument von dispatch_time() (Delta) ist in Nanosekunden angegeben, die zurückgegebene dispatch_time_t hängt jedoch von der CPU-Architektur ab. Bei Intel wird der zurückgegebene Wert in Nanosekunden gemessen. Bei Apple Silicon wird der Wert in Ticks angegeben.

Da die beiden Werte nicht auf die gleiche Weise gemessen werden, können Sie auf diese Weise keine Zahlen berechnen.

Hier ist ein neuer Test. Beachten Sie, dass mac_absolute_time immer vor der Jetztzeit von dispatch_time liegt.

// cc -framework Foundation  -o dispatch_time dispatch_time.m
#include <time.h>
#include <mach/mach_time.h>
#import <Foundation/Foundation.h>
int main() {
    dispatch_time_t now = dispatch_time(DISPATCH_TIME_NOW, 0);
    dispatch_time_t delta = (uint64_t) (1 * NSEC_PER_SEC);
    dispatch_time_t when = dispatch_time(now, delta);

    NSLog(@"mac_absolute_time: %llu", mach_absolute_time());
    NSLog(@"now: %llu", now);
    NSLog(@"delta: %llu", delta);
    NSLog(@"when: %llu", when);
    NSLog(@"invalid: when-now delta: %llu", when-now);
    return 0;
}


Beantwortet von –
James Risner


Antwort geprüft von –
Cary Denson (FixError Admin)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like