修正日: 07/10/23
Sampler
Performance Tools入門 その2
3. サンプリング結果を見る
サンプリングを停止すると、サンプリング数および関数名とあわせてスタックツリーがブラウザに表示されます(図2)(デバッグシンボルを持たないアプリケーションの場合は当然関数名が表示されませんので注意しましょう)。このブラウザがSamplerを使った最適化作業の中心になります。ブラウザの中から処理に時間のかかっている関数を見つけ出し、処理内容の改善を行います。ここではサンプルアプリケーション「SamplerSample」のRoutin1ボタンを押した処理のサンプリング結果を元に説明します(実際に試してみてください)。【図2】 サンプリング結果のブラウザ
![](images/sampler/2.png)
例えば図2のような結果の場合、以下のような解釈ができます。
全体のサンプル数1,218個(上の「Stacks (Displayed/Total): 」)のうち[SampleUnit routin1:]は402個。つまりサンプリング中、対象アプリのスタックを10msec間隔(左の「Sampling Rate: 10msec」)で1,218回チェックしたところ、そのうちroutin1:を実行していたスタックは402個ということです。つまりサンプリングしていた時間内では[SampleUnit routin1:]が1/3弱の時間を使っていたということになります。
[SampleUnit routin1:](402個)から呼ばれた処理はsubRoutin1:(上の方)が202個、subRoutin2:(下の方)が195個。routin1:の処理の内訳はsubRoutin1:とsubRoutin2:がほぼ半々で、subRoutin1:の方がやや重い処理であるということがわかります。各関数の処理内容は以下のとおりです。
- (IBAction)routin1:(id)sender
{
int i;
for(i=0;i<6;++i)
[self subRoutin1:self];
for(i=0;i<6;++i)
[self subRoutin2:self];
}
- (IBAction)subRoutin1:(id)sender
{
int i;
NSString *aString;
for(i=0;i<50000;++i)
{
aString=[[NSString alloc] initWithFormat:
@"This is test string No.%d!!",i];
[aString autorelease];
}
}
- (IBAction)subRoutin2:(id)sender
{
int i;
NSString *aString;
for(i=0;i<50000;++i)
{
aString=[[NSString alloc] initWithFormat:
@"This is test string No.%d!!",i];
[aString release];
}
}
(サンプル数とは?)
Samplerはサンプリング中、一定時間(自由に指定できます。上記の例では10msec)ごとに実行中のスタックのスナップショットを作成して保存しています。サンプリングが終了すると各関数、メソッドが全てのスタックのうちの何回で実行されているかを算出します。
上記ではサンプリング中にスタックを1,218回チェックしたところ、そのうちの402回で[SampleUnit routin1:]が実行中であった、ということであり、routin1:が402回呼び出されたということではありません。あくまでも全体的な傾向です。
routin1:の処理は少し重いようなので改善してみましょう。subRoutin2:よりもsubrRoutin1:の方が負荷が大きいようなので実行回数を半分にしてみます。
- (IBAction)routin2:(id)sender
{
int i;
for(i=0;i<3;++i)
[self subRoutin1:self];
for(i=0;i<6;++i)
[self subRoutin2:self];
}
SamplerSampleのroutin2ボタンで上記のroutin2:を実行できます。再度Samplerを使ってroutin2:の処理をサンプリングし、結果がどのように変わるか確認してみてください。
このように、ブラウザの中から処理に時間がかかっている関数を見つけ、その関数を見直して最適化をする、というのがSamplerを使った基本的な最適化の方法になります。当然「起動プロセス」「あるアクションの実行」「保存」など処理ごとに分割して複数回サンプリングを行い、個別に内容を検討した方がより問題箇所を見つけやすくなります。
以下ではより細かい使い方を紹介します。