TimeProfilerを使ってみた(CookPad potatotips 第2回)

https://github.com/potatotips/potatotips/wiki/potatotips-2


処理の高速化をするとき
→ボトルネックを探す

すでにアタリが付いている場合
→処理の最初と最後にNSLogで出力してみる(日時が出るので)

更に正確な処理時間を測りたい場合
→clockやgettimeofdayを使って計測する

もっとスマートに(かっこよく、デキル風に)測りたい
→InstrumentsのTimeProfilerを使う

==========

実際にやってみる

macのシミュレータ上で1MBのファイルを100個コピーする時間を計測してみた

スクリーンショット 2013 12 11 3 01 26

NSLog : 0.38秒
clock : 0.1145秒
gettimeofday : 0.368秒

・・・

clockがやけに早すぐる・・・ 

==========

InstrumentsのTimeProfilerで見てみる

スクリーンショット 2013 12 11 3 06 00

どれも同じくらい。

だけど、clockの値に一番近くて他の2つと差がありすぎる。

ファイルコピーじゃなくて違う処理を試してみる。

==========

[NSThread sleepForTimeInterval:2];

の時

スクリーンショット 2013 12 11 3 09 52

スクリーンショット 2013 12 11 3 10 37

2秒待つはずなのに2msと表示されている

==========

sleepじゃなくてclockで自前で待機してみる

clock_t t1;
t1 = clock();
while(true) {
if( ((double)(clock() - t1) / CLOCKS_PER_SEC) >= 2.0 ) {
break;
}
}

の時

スクリーンショット 2013 12 11 3 13 19スクリーンショット 2013 12 11 3 14 13

 ==========

ついでに、1MBx100個ではなくて、100MBx1個の時間を測ってみる。

スクリーンショット 2013 12 11 3 17 57

スクリーンショット 2013 12 11 3 19 17

==========

以上のことから、

・NSLogで表示される時間は(多分)gettimeofdayの時間ぽい。

・TimeProfilerのRunningTimeはCPUの稼働時間のみを計測するもの

・FileI/Oなどの待ち時間が絡んでくるとTimeProfilerだけでは計測できない?

・適当にTimeProfilerを使ってると思わぬところの処理負荷を見逃す可能性がある

==========

でも、FileI/Oとか含めたトータルでの負荷を見たい(Instrumentsで)

スクリーンショット 2013 12 11 3 25 22

Record Waiting Threads にチェックを入れる

==========

もう一回

[NSThread sleepForTimeInterval:2];

で測ってみる

スクリーンショット 2013 12 11 3 27 19

スクリーンショット 2013 12 11 3 30 20

3つとも大体同じ値になった。

RunningTimeの部分がSamplesになっている。

Samplesの値は、SampleIntervalで設定した10ms間隔で何回サンプリングが行われたか、の値(のはず)。

==========

ということで

TimeProfilerを使って処理負荷を探すときは

CPU処理のボトルネック(計算とか)を見つけたい場合と

FileI/Oとかも含めた負荷を見たい場合で、適宜設定を行いましょう。

==========

おまけ

・シミュレータのデバッグメニューでビューの重なりが見えたりするよ(From横浜Dev)

スクリーンショット 2013 12 11 3 36 19

 

・SparkInspectorってやつでも楽しげに見えるよ(From Twitterの誰か)

スクリーンショット 2013 12 11 3 39 30

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>