https://github.com/potatotips/potatotips/wiki/potatotips-2
処理の高速化をするとき
→ボトルネックを探す
すでにアタリが付いている場合
→処理の最初と最後にNSLogで出力してみる(日時が出るので)
更に正確な処理時間を測りたい場合
→clockやgettimeofdayを使って計測する
もっとスマートに(かっこよく、デキル風に)測りたい
→InstrumentsのTimeProfilerを使う
==========
実際にやってみる
macのシミュレータ上で1MBのファイルを100個コピーする時間を計測してみた
NSLog : 0.38秒
clock : 0.1145秒
gettimeofday : 0.368秒
・・・
clockがやけに早すぐる・・・
==========
InstrumentsのTimeProfilerで見てみる
どれも同じくらい。
だけど、clockの値に一番近くて他の2つと差がありすぎる。
ファイルコピーじゃなくて違う処理を試してみる。
==========
[NSThread sleepForTimeInterval:2];
の時
2秒待つはずなのに2msと表示されている
==========
sleepじゃなくてclockで自前で待機してみる
clock_t t1;
t1 = clock();
while(true) {
if( ((double)(clock() - t1) / CLOCKS_PER_SEC) >= 2.0 ) {
break;
}
}
の時
==========
ついでに、1MBx100個ではなくて、100MBx1個の時間を測ってみる。
==========
以上のことから、
・NSLogで表示される時間は(多分)gettimeofdayの時間ぽい。
・TimeProfilerのRunningTimeはCPUの稼働時間のみを計測するもの
・FileI/Oなどの待ち時間が絡んでくるとTimeProfilerだけでは計測できない?
・適当にTimeProfilerを使ってると思わぬところの処理負荷を見逃す可能性がある
==========
でも、FileI/Oとか含めたトータルでの負荷を見たい(Instrumentsで)
Record Waiting Threads にチェックを入れる
==========
もう一回
[NSThread sleepForTimeInterval:2];
で測ってみる
3つとも大体同じ値になった。
RunningTimeの部分がSamplesになっている。
Samplesの値は、SampleIntervalで設定した10ms間隔で何回サンプリングが行われたか、の値(のはず)。
==========
ということで
TimeProfilerを使って処理負荷を探すときは
CPU処理のボトルネック(計算とか)を見つけたい場合と
FileI/Oとかも含めた負荷を見たい場合で、適宜設定を行いましょう。
==========
おまけ
・シミュレータのデバッグメニューでビューの重なりが見えたりするよ(From横浜Dev)
・SparkInspectorってやつでも楽しげに見えるよ(From Twitterの誰か)