2009-04-12 8 views
144

मुझे दो घटनाओं के बीच समाप्त होने वाला समय प्राप्त करने की आवश्यकता है: उदाहरण के लिए UIView की उपस्थिति और उपयोगकर्ता की पहली प्रतिक्रिया के बीच।समय बीतने (उद्देश्य-सी)

उत्तर

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

timeInterval प्रारंभ और बीच का अंतर है अब, सेकंड, उप millisecond परिशुद्धता के साथ में।

+1

+1, अच्छा और पूर्वी उत्तर। धन्यवाद। :) – mAc

+5

इसलिए यदि यह सही ढंग से –

+18

@ निकोलसज़ोजोल समझा गया तो यह नकारात्मक मान है, आप फ्लोट के पूर्ण मूल्य प्राप्त करने के लिए 'fabs (...)' का उपयोग कर सकते हैं। उदाहरण के लिए। 'एनएसटीआईएम अंतराल समय अंतराल = fabs ([प्रारंभ समय अंतराल सेन्स]];' –

5

नीचे की तरह NSDate वर्ग के timeIntervalSince1970 समारोह का उपयोग करें:

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

मूल रूप से, यह क्या मैं 2 अलग तिथियों के बीच सेकंड में अंतर की तुलना करने का उपयोग करें। भी इस लिंक here

9

percise समय माप के लिए (GetTickCount की तरह) की जाँच, यह भी mach_absolute_time पर एक नज़र है और इस एप्पल क्यू & एक ले: http://developer.apple.com/qa/qa2004/qa1398.html

23

timeIntervalSinceDate विधि

NSTimeInterval secondsElapsed = [secondDate timeIntervalSinceDate:firstDate]; 

NSTimeInterval सिर्फ एक double है का उपयोग करें, इस तरह NSDate में परिभाषित:

typedef double NSTimeInterval; 
14

किसी को यहाँ आने से iOS के लिए एक getTickCount() लागू करने के लिए की तलाश में के लिए, यहाँ है विभिन्न स्रोतों को एक साथ रखने के बाद मेरा:

#include <mach/mach.h> 
#include <mach/mach_time.h> 

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; 
} 
+0

कोई भी जानता है कि mach_timebase_info कॉल पर अनावश्यक (शून्य) कास्ट क्यों है? –

+0

@ सिमन टिलसन यह एक अच्छा सवाल है - या तो इसे चेतावनी चुप करने की आवश्यकता थी, या मैंने इसे कहीं और से कॉपी किया और बस इसे हटाने के लिए नोटिस नहीं किया। मुझे याद नहीं है –

200

आपको समय-समय पर प्रयोजनों के लिए [NSDate date] पर भरोसा नहीं करना चाहिए क्योंकि यह समय-समय पर या अधिक समय तक रिपोर्ट कर सकता है। ऐसे मामले भी हैं जहां आपका कंप्यूटर समय-समय पर यात्रा करेगा क्योंकि विलुप्त समय नकारात्मक होगा! (उदा अगर घड़ी समय के दौरान पीछे की ओर ले जाया गया।)

Winter 2013 Stanford iOS course (34:00) के "उन्नत आईओएस इशारा मान्यता" व्याख्यान में आरिया haghighi के अनुसार, आप CACurrentMediaTime() का उपयोग करना चाहिए अगर आप एक सटीक समय अंतराल की जरूरत है।

ऑब्जेक्टिव-सी:

#import <QuartzCore/QuartzCore.h> 
CFTimeInterval startTime = CACurrentMediaTime(); 
// perform some action 
CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime; 

स्विफ्ट:

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

कारण है कि सर्वर पर [NSDate date] समन्वयित हो जाता है, तो यह "समय-सिंक हिचकी" करने के लिए ले जा सकता है जो बहुत मुश्किल-से-ट्रैक बग का कारण बन सकता है। दूसरी ओर, CACurrentMediaTime(), एक डिवाइस समय है जो इन नेटवर्क syncs के साथ नहीं बदलता है।

आपको अपने लक्ष्य की सेटिंग्स में addQuartzCore framework की आवश्यकता होगी।

+14

कृपया इसे ऊपर उठाएं। हालांकि मुझे लगता है कि हर कोई इस बात से सहमत हो सकता है कि एनएसडीएट आपका पहला विकल्प होना चाहिए, इस सुझाव ने मेरा मुद्दा हल किया। एक प्रेषण ब्लॉक के भीतर एक समापन ब्लॉक के भीतर '[एनएसडीएटी तिथि] 'को कॉल करते समय, मुझे वही" चालू "समय मिल रहा था जिसे निष्पादन से पहले [एनएसडीएटी तिथि]' द्वारा रिपोर्ट किया जा रहा था, जिस बिंदु पर मेरे ब्लॉक बनाए गए थे। 'CACurrentMediaTime()' ने इस मुद्दे को हल किया। – n00neimp0rtant

+0

हम एमएम: एसएस जैसे प्रदर्शन के लिए elapsedTime का उपयोग कैसे करेंगे? – CyberMew

+0

मैंने कभी इस बारे में क्यों नहीं सुना है ... – Morkrom

1

अन्य उत्तरों सही हैं (एक चेतावनी * के साथ)।मैं बस एक उदाहरण उपयोग दिखाने के लिए इस उत्तर जोड़ें:

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

* चेतावनी:: दूसरों के रूप में उल्लेख किया

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

} डिबगर कंसोल पर

, तो आप कुछ इस तरह दिखाई , केवल आकस्मिक उद्देश्यों के लिए लंबित समय की गणना करने के लिए NSDate का उपयोग करें। ऐसा एक उद्देश्य सामान्य परीक्षण, क्रूड प्रोफाइलिंग हो सकता है, जहां आप एक विधि को कितनी देर तक ले रहे हैं, इस बारे में कोई अंदाजा नहीं चाहते हैं।

जोखिम यह है कि डिवाइस घड़ी की वर्तमान समय सेटिंग किसी भी समय नेटवर्क घड़ी समन्वयन के कारण बदल सकती है। तो NSDate समय किसी भी समय आगे या पिछड़ा कूद सकता है।

संबंधित मुद्दे