2008-10-15 40 views

回答

7

除非這兩段代碼中的一段已經在您的應用中,您已經對應用的整體性能進行了剖析,以確定現有代碼是一個主要瓶頸,那麼您所做的就是所謂的「過早優化「。

Xcode中包括一個極好的工具profiler稱爲 「Shark。」對於某些版本,它位於/ Developer/Applications中;對於其他人,它位於「性能工具」子目錄中。

鯊魚會告訴你到底有多少時間,作爲整體執行時間的百分比,您的應用程序在代碼中的每個部分的支出。使用像鯊魚的工具的思路是遵循「80/20法則」 - 您的應用程序將花費其80%的時間運行其代碼的20%,所以爲了達到最佳效果,你應該花的時間80%優化相同的20%。

因此,要直接回答你的問題,假設你有運行鯊魚,而你正在尋找最優化最上面的瓶頸,只需用優化的代碼替換它,並再次運行鯊魚在你的應用程序。然後,比較在替換代碼中花費的總時間與原始代碼的百分比。

+0

絕對使用鯊魚 - 這是你一直想要和最終擁有的性能工具。謝爾姆的鏈接是用戶指南。絕對要經歷它。技術說明2086是另一個很好的參考:http://developer.apple.com/technotes/tn/tn2086.html – heckj 2008-10-15 22:08:33

2

嗚鯊,耶。另見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); 
} 
1

假設你要分析整個應用程序(不只是一小段代碼),並且您的應用程序是用C/C++/Objective-C的(不,如紅寶石),而且你使用Xcode 3.0或更高版本,您還應該查看Instruments應用程序。 「採樣器」樂器會給你非常類似的信息鯊魚(雖然沒有鯊魚有時非常提高性能有用的提示)。此外,您可以跟蹤其他資源利用率(GC,核心數據,網絡,磁盤I/O等),這些可能是應用程序性能比代碼效率更重要的決定因素(同樣取決於應用程序)。儀器也可以使用OS X 10.5(man dtrace)中的DTrace支持。您可以使用DTrace編寫自己的工具來更具體地監視應用程序(例如調用一個或多個方法)。

使用NSLog是個壞主意,正如您懷疑的那樣,因爲它可能會使用Apple系統日誌記錄系統。在向asl寫入日誌時出現非確定性延遲,並在控制檯中顯示。我不確定何時設置時間戳。