2009-10-23 67 views
5

我將調用什麼對象/方法來獲取以毫秒(或高精度)爲單位的當前時間以幫助測量方法執行的時間?測量方法執行時間的基本方法

的NSDate的timeIntervalSinceDate將返回其以秒爲單位NSInterval。我正在尋找更細粒度的東西,類似於Java的System.currentTimeMillis。

在objective-c/CocoaTouch中是否有等效版本?

+0

我之所以使用一些快速和骯髒的我的代碼時機是因爲我想縮小一個看起來有問題的區域,並且在運行Instruments和Shark之​​後我沒有任何運氣獲得非常多的信息。所以爲了避免被卡住,我選擇了這條路線。 – 2009-10-26 17:01:42

+0

dispatch_benchmark()是一種方法:http://nshipster.com/benchmarking/ – LearnCocos2D 2015-07-15 09:20:09

回答

9

實際上,+[NSDate timeIntervalSinceReferenceDate]返回一個NSTimeInterval,這是一個雙一個typedef。文檔說

NSTimeInterval總是以秒爲單位指定;它在10,000年的範圍內產生亞毫秒精度。

所以,它的安全使用毫秒精確定時。我一直這樣做。

+0

謝謝 - 我誤解了文檔。 – 2009-10-23 22:01:14

+3

你調用'timeIntervalSinceReferenceDate'時會耗費很多時間,這會以不可預知的方式偏離結果。 – 2009-10-24 06:13:07

+0

Downvoted是因爲 - 實驗性的 - 正如@GeorgSchölly所說,Apple已經實現了NSDate *非常慢*(至少在iOS上)。它毫無用處 - 它們的「timeInterval *」方法調用實際上在儀器中顯示爲一個項目中最大的CPU佔用! – Adam 2013-08-03 20:14:05

2

timeIntervalSinceReferenceDate非常好。

但是,除非這是一個長期運行的方法,否則這不會產生太多的成果。當您談論幾毫秒的執行時,執行時間可能會大相徑庭。如果你的線程/進程在中途被搶佔,你將會有非確定性的尖峯。基本上,你的樣本量太小。要麼使用分析器,要麼運行100,000次迭代來獲得總時間併除以100,000以獲得平均運行時間。

25

對於OS X上的非常精細的定時,我使用mach_absolute_time(),它在<mach/mach_time.h>中定義。

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

static double ticksToNanoseconds = 0.0; 

uint64_t startTime = mach_absolute_time(); 
// Do some stuff you want to time here 
uint64_t endTime = mach_absolute_time(); 

// Elapsed time in mach time units 
uint64_t elapsedTime = endTime - startTime; 

// The first time we get here, ask the system 
// how to convert mach time units to nanoseconds 
if (0.0 == ticksToNanoseconds) { 
    mach_timebase_info_data_t timebase; 
    // to be completely pedantic, check the return code of this next call. 
    mach_timebase_info(&timebase); 
    ticksToNanoseconds = (double)timebase.numer/timebase.denom; 
} 

double elapsedTimeInNanoseconds = elapsedTime * ticksToNanoseconds; 
1

如果你想調整你的代碼的性能,你會做的更好用儀器或鯊魚讓您的應用程序將時間花在的整體情況:您可以按如下方式使用它。

4

不要使用NSDate這一點。你失去了很多調用方法和實例化對象的精度,甚至可能釋放內部的東西。你只是沒有足夠的控制權。

使用time.hStephen Canon建議mach/mach_time.h。他們都更準確。

做到這一點,最好的辦法就是火了儀器或鯊魚,將它們連接到你的進程(工程,即使它已經運行),並讓他們測量方法所花費的時間。

後你熟悉它這需要比任何放入的馬赫 - 時間的功能,和重新編譯最全的應用解決方案的時間就更少了。你甚至可以獲得更多的信息。我不會滿足於此。

+0

注:有些儀器沒有用處的用例。例如一個OpenGL應用程序 - 我需要知道哪些着色器運行速度較快,哪些着色器運行速度較慢,哪些背景方法在最終用戶的設備上花費了多少時間。在某些情況下,我想要動態切換到不同的渲染路徑。不能要求他們運行樂器;),並且這將防止運行時變化,所以...時間/ mach_time是好的。 – Adam 2013-08-03 20:17:58

1

我會重新發布我的答案從另一個職位在這裏。請注意,我固然簡單的解決這個複雜的問題用的NSDate和NSTimeInterval爲基礎:


我知道這是一個古老的,但即使我發現自己徘徊過去一遍,所以我想我會提出我的自己的選擇。

最好的辦法是看看我的博客文章在此:基本上 Timing things in Objective-C: A stopwatch

,我寫了一個類,它不停止觀看一個非常基本的方式,但封裝時,你只需要做到以下幾點:

[MMStopwatchARC start:@"My Timer"]; 
// your work here ... 
[MMStopwatchARC stop:@"My Timer"]; 

而且你結束了:

MyApp[4090:15203] -> Stopwatch: [My Timer] runtime: [0.029] 
在日誌中

...

再次,看看我的文章多一點或者在這裏下載: MMStopwatch.zip

+0

如上所述:你不應該使用NSDate。此外,這個答案真的沒有增加任何東西,它簡單地重新包裝現有的(間斷的)方法在額外的間接,這沒有幫助 – Adam 2013-08-03 20:15:51

+0

我請求在這裏有所不同。 NSDate適用於某些操作。正如我所說,這是一個非常困難的問題的簡單解決方案。我同意所選答案的確切性是一個更好的選擇。也就是說,我仍然喜歡使用兩行代碼來了解我的程序中的時間。 – bladnman 2013-08-05 18:31:03

0

@bladnman我愛你的秒錶事情..我用它所有的時間。這裏有一個小塊,我寫的是消除需要最後的呼叫,並使它更簡單(如果這似乎有可能)使用,哈哈。

+(void)stopwatch:(NSString*)name timing:(void(^)())block { 
    [MMStopwatch start:name]; 
    block(); 
    [MMStopwatch stop: name]; 
} 

那麼你可以把它的地方..

[MMStopwatch stopwatch:@"slowAssFunction" timing:^{ 
    NSLog(@"%@",@"someLongAssFunction"); 
}]; 

someLongAssFunction

-> Stopwatch: [slowAssFunction] runtime:[0.054435] 

你應該張貼吸盤github上 - 讓人們可以很容易找到它/貢獻等。 這很棒。謝謝。

+0

太棒了!我喜歡。在一個塊中使用它是有道理的。很酷。 – bladnman 2013-08-05 18:27:52