Obtenir du temps dans Objective-C

Je dois obtenir le temps écoulé entre deux événements, par exemple l’apparition d’un UIView et la première réaction de l’utilisateur.

Comment puis-je l’atteindre en Objective-C?

NSDate *start = [NSDate date]; // do stuff... NSTimeInterval timeInterval = [start timeIntervalSinceNow]; 

timeInterval est la différence entre le début et maintenant, en secondes, avec une précision inférieure à la milliseconde.

Vous ne devez pas vous fier à la [NSDate date] pour les besoins du temps, car il peut sur ou sous-déclarer le temps écoulé. Il y a même des cas où votre ordinateur semble voyager dans le temps puisque le temps écoulé sera négatif! (Par exemple, si l’horloge a reculé pendant le chronométrage.)

Selon Aria Haghighi dans la conférence “Advanced iOS Gesture Recognition” du cours iOS 2013 de Stanford (34:00), vous devriez utiliser CACurrentMediaTime() si vous avez besoin d’un intervalle de temps précis.

Objectif c:

 #import  
 CFTimeInterval startTime = CACurrentMediaTime(); // perform some action CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime; 

Rapide:

 let startTime = CACurrentMediaTime() // perform some action let elapsedTime = CACurrentMediaTime() - startTime 

La raison en est que [NSDate date] synchronise sur le serveur, ce qui peut entraîner des «problèmes de synchronisation» qui peuvent entraîner des bogues très difficiles à suivre. CACurrentMediaTime() , par contre, est une heure de périphérique qui ne change pas avec ces synchronisations réseau.

Vous devrez append le framework QuartzCore aux parameters de votre cible.

Utilisez la méthode timeIntervalSinceDate

 NSTimeInterval secondsElapsed = [secondDate timeIntervalSinceDate:firstDate]; 

NSTimeInterval est juste un double , définissez comme ceci dans NSDate :

 typedef double NSTimeInterval; 

Pour quiconque vient ici pour chercher une implémentation de getTickCount () pour iOS, voici la mienne après avoir réuni plusieurs sources:

 #include  #include  uint64_t getTickCount(void) { static mach_timebase_info_data_t sTimebaseInfo; uint64_t machTime = mach_absolute_time(); // Convert to nanoseconds - if this is the first time we've run, get the timebase. if (sTimebaseInfo.denom == 0 ) { (void) mach_timebase_info(&sTimebaseInfo); } // Convert the mach time to milliseconds uint64_t millis = ((machTime / 1000000) * sTimebaseInfo.numer) / sTimebaseInfo.denom; return millis; } 

Pour les mesures de temps en pourcentage (comme GetTickCount), consultez également mach_absolute_time et cet Apple Q & A: http://developer.apple.com/qa/qa2004/qa1398.html .

utilisez la fonction timeIntervalSince1970 de la classe NSDate comme ci-dessous:

 double start = [startDate timeIntervalSince1970]; double end = [endDate timeIntervalSince1970]; double difference = end - start; 

En gros, c’est ce que j’utilise pour comparer la différence en secondes entre deux dates différentes. vérifier aussi ce lien ici

Les autres réponses sont correctes (avec un avertissement *). J’ajoute cette réponse simplement pour montrer un exemple d’utilisation:

 - (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. } 

Sur la console du débogueur, vous voyez quelque chose comme ceci:

 DEBUG Method '-[XMAppDelegate getYourAffairsInOrder]' ran. Elapsed: 0.033827 seconds. 

* Avertissement: Comme d’autres l’ont mentionné, utilisez NSDate pour calculer le temps écoulé uniquement à des fins occasionnelles. L’un de ces objectives pourrait être le test commun, le profilage brut, pour lequel vous souhaitez simplement avoir une idée approximative de la durée d’une méthode.

Le risque est que l’heure actuelle de l’horloge de l’appareil puisse changer à tout moment en raison de la synchronisation de l’horloge du réseau. NSDate temps NSDate peut donc avancer ou reculer à tout moment.