2009-10-23 22 views
5

メソッドの実行時間を測定するのに役立つように、現在の時間をミリ秒(または精度)で取得するために呼び出すオブジェクト/メソッドはありますか?メソッドの実行時間を測定する基本的な方法

NSDateのtimeIntervalSinceDateは、秒単位で測定されるNSIntervalを返します。私は、JavaのSystem.currentTimeMillisに似た何か細かい粒度のものを探しています。

objective-c/CocoaTouchに相当するバージョンはありますか?

+0

私は、インスツルメントとサメを走らせた後に問題のように思える領域を絞り込みたいと思っていました。私はこのルートを選択していました。 –

+0

dispatch_benchmark()は1つの方法です:http://nshipster.com/benchmarking/ – LearnCocos2D

答えて

9

実際には、+[NSDate timeIntervalSinceReferenceDate]は、NSTimeIntervalを返します。これはダブルのtypedefです。ドキュメントは

と指定します。NSTimeIntervalは常に秒単位で指定します。それは10,000年の範囲にわたってサブミリ秒の精度をもたらす。

ミリ秒の精度のタイミングには安全です。私はいつもそうしています。

+0

ありがとう - 私はドキュメントを誤解しました。 –

+3

'timeIntervalSinceReferenceDate'を呼び出すだけで多くの時間を費やすことができます。これは、予測できない方法で結果を偏らせます。 –

+0

@GeorgSchöllyによると、実験的に - AppleはNSDateを(少なくともiOSでは)極端に遅い*に実装しているため、Downvotedしています。彼らの "timeInterval *"メソッド呼び出しは、インスツルメントで実際に1つのプロジェクトで最大のCPU豚として登場しました! – Adam

2

timeIntervalSinceReferenceDateは完全に問題ありません。

しかし、それが長期間続く方法でない限り、これはあまり効果がありません。実行時間は、数ミリ秒の実行について話しているときには、大きく変わることがあります。あなたのスレッド/プロセスが途中まで先取りされると、非決定論的なスパイクが発生します。基本的に、サンプルサイズが小さすぎます。プロファイラを使用するか、100,000回の反復を実行して合計時間を取得し、平均実行時間を得るために100,000で除算します。

25

OS Xの非常に細かいタイミングでは、私はを使用します。これは<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.hまたはStephen Canonのいずれか(mach/mach_time.h)を使用してください。どちらもずっと正確です。

これを実行する最も良い方法は、InstrumentsまたはSharkを起動し、それらをプロセスにアタッチし(すでに実行中であっても機能する)、メソッドにかかる時間を測定させることです。

これをよく理解してから、これは、マッチタイム機能と再コンパイルのアプリケーション全体のソリューションよりも時間がかかりません。あなたはさらに多くの情報を得ます。私はそれほど決して落ち着きません。

+0

注意:Instrumentsが役に立たないユースケースがあります。例えばOpenGLアプリ - どのシェーダが速いか遅いか、どのバックグラウンドメソッドがどれくらいの時間をエンドユーザのデバイスで使用しているかを知る必要があります。場合によっては、結果として異なるレンダリングパスに動的に切り替える必要があります。インストルメントを実行するように頼むことはできません)、それは実行時の変更を避けることになるので、time/mach_timeは良いです。 – Adam

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

+0

私はここで違うように頼みます。 NSDateは特定の操作には問題ありません。私が述べたように、それは非常に難しい質問に対する単純な解決策です。私は、選択された答えの正確さが確かに良い選択であることに同意します。つまり、自分のプログラムで時間のアイデアを得るために2つのクイックラインを使用するのが好きです。 – bladnman

0

@bladnmanは、私はすべての時間をそれを使用する...あなたのストップウォッチの事を愛して...ここで私が書いた小さなブロックは、それがなくなりますクローズコールの必要性、そしてそれをもっと簡単に(たとえそれが可能であったとしても)使うことができます、笑。人々はそれが簡単に/貢献見つけることができるようになど、 -

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

その後、あなただけのあなたはgithubのにその吸盤を投稿する必要があり

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

someLongAssFunction

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

...どこにそれを呼び出すことができます。 それは素晴らしい。ありがとう。

+0

素晴らしい!私はそれが好きです。それをブロックで使用することは理にかなっています。とてもかっこいい。 – bladnman

関連する問題