比方說,我有兩個代碼互換件,我想弄清楚它們中的哪一個需要更少的處理器時間執行。我將如何做到這一點?如何分析一段代碼需要多長時間在Objective-C /可可執行優化的目的
爲了得到一個非常粗略的估計,我可以只是把的NSLog()上,我想分析代碼的兩側呼籲,但似乎處理器在其它方面非常忙會歪曲結果。
比方說,我有兩個代碼互換件,我想弄清楚它們中的哪一個需要更少的處理器時間執行。我將如何做到這一點?如何分析一段代碼需要多長時間在Objective-C /可可執行優化的目的
爲了得到一個非常粗略的估計,我可以只是把的NSLog()上,我想分析代碼的兩側呼籲,但似乎處理器在其它方面非常忙會歪曲結果。
除非這兩段代碼中的一段已經在您的應用中,和您已經對應用的整體性能進行了剖析,以確定現有代碼是一個主要瓶頸,那麼您所做的就是所謂的「過早優化「。
Xcode中包括一個極好的工具profiler稱爲 「Shark。」對於某些版本,它位於/ Developer/Applications中;對於其他人,它位於「性能工具」子目錄中。
鯊魚會告訴你到底有多少時間,作爲整體執行時間的百分比,您的應用程序在代碼中的每個部分的支出。使用像鯊魚的工具的思路是遵循「80/20法則」 - 您的應用程序將花費其80%的時間運行其代碼的20%,所以爲了達到最佳效果,你應該花的你時間80%優化相同的20%。
因此,要直接回答你的問題,假設你有運行鯊魚,而你正在尋找最優化最上面的瓶頸,只需用優化的代碼替換它,並再次運行鯊魚在你的應用程序。然後,比較在替換代碼中花費的總時間與原始代碼的百分比。
嗚鯊,耶。另見Shark Remote Control。基本上,從鯊魚菜單中選擇Sampling > Programmatic (Remote)
,然後調用chudStartRemotePerfMonitor和chudStopRemotePerfMonitor()括起您想要分析的特定代碼。
這且不說,這裏有一段代碼,我想留做日後時機。
首先使用
uint64_t startTime, stopTime;
startTime = mach_absolute_time();
< work to time goes here >
stopTime = mach_absolute_time();
logMachTime_withIdentifier_(stopTime - startTime, @"10000000 class messages");
和這裏的輔助功能,logMachTime_withIdentifier_
。
#import <mach/mach_time.h>
void logMachTime_withIdentifier_(uint64_t machTime, NSString *identifier) {
static double timeScaleSeconds = 0.0;
if (timeScaleSeconds == 0.0) {
mach_timebase_info_data_t timebaseInfo;
if (mach_timebase_info(&timebaseInfo) == KERN_SUCCESS) { // returns scale factor for ns
double timeScaleMicroSeconds = ((double) timebaseInfo.numer/(double) timebaseInfo.denom)/1000;
timeScaleSeconds = timeScaleMicroSeconds/1000000;
}
}
NSLog(@"%@: %g seconds", identifier, timeScaleSeconds*machTime);
}
假設你要分析整個應用程序(不只是一小段代碼),並且您的應用程序是用C/C++/Objective-C的(不,如紅寶石),而且你使用Xcode 3.0或更高版本,您還應該查看Instruments應用程序。 「採樣器」樂器會給你非常類似的信息鯊魚(雖然沒有鯊魚有時非常提高性能有用的提示)。此外,您可以跟蹤其他資源利用率(GC,核心數據,網絡,磁盤I/O等),這些可能是應用程序性能比代碼效率更重要的決定因素(同樣取決於應用程序)。儀器也可以使用OS X 10.5(man dtrace
)中的DTrace支持。您可以使用DTrace編寫自己的工具來更具體地監視應用程序(例如調用一個或多個方法)。
使用NSLog
是個壞主意,正如您懷疑的那樣,因爲它可能會使用Apple系統日誌記錄系統。在向asl寫入日誌時出現非確定性延遲,並在控制檯中顯示。我不確定何時設置時間戳。
絕對使用鯊魚 - 這是你一直想要和最終擁有的性能工具。謝爾姆的鏈接是用戶指南。絕對要經歷它。技術說明2086是另一個很好的參考:http://developer.apple.com/technotes/tn/tn2086.html – heckj 2008-10-15 22:08:33