再帰の効果

synprog のパフォーマンスデータを収集したことを確認してください。 これらの作業がまだ済んでいない場合には、synprog サンプルのデータ収集を参照して実行してください。 パフォーマンスデータを収集したら、実験 test.1.er を開きます。

ここでは、パフォーマンスアナライザが再帰的シーケンスでメトリックを関数に割り当てる方式を紹介します。再帰の効果では、直接的再帰関数呼び出しと間接的再帰関数呼び出しの両方の再帰シーケンスにおいて、呼び出し元がどのように時間の消費に寄与するかについて調べます。 標本コレクタが収集したデータ内では関数呼び出しの各インスタンスが記録されますが、解析では特定の関数のすべてのインスタンスのメトリックが集められます。 synprog プログラムには、再帰呼び出しシーケンスの例として次の 2 つが用意されています。

いずれの場合も、排他的メトリックは実際に処理が実行される関数に属します。この例で実際に処理が実行される関数は、real_recurse()bounce_a() です。 これらの排他的メトリックは、最終的な関数を呼び出すあらゆる関数に包括的メトリックとして渡されます。

直接的な再帰

  1. 「関数」タブで関数 recurse() 検索し、選択します。

    関数リストをスクロールする代わりに「検索」ツールを利用できます。

    recurse() 関数には包括的ユーザー CPU 時間が表示されますが、recurse()real_recurse() の呼び出し以外に何も行わないため、その排他ユーザー CPU 時間はゼロになっています。

    : プロファイル実験が統計的な性質をもっており、synprog 上で行う実験が recurse() 関数の消費したごく短い時間を記録している可能性があるため、小さな排他的 CPU 時間値が recurse() に表示されることがあります。 しかし、このようなイベントに起因する排他時間は、包括時間に比べるとごくわずかです。

  2. 選択した関数 ComputeA() が「呼び出し元-呼び出し先」タブの中央区画に表示され、その呼び出し元が上部区画に表示されます。

    選択した関数 recurse() が中央区画に表示されます。 recurse() によって呼び出された関数 real_recurse() は、下部区画に表示されます。 この区画は、「呼び出し先」区画と呼ばれます。

  3. real_recurse() をクリックします。

    「呼び出し元-呼び出し先」タブに、real_recurse() に関する次の情報が表示されます。

間接的な再帰

  1. 「関数」タブで関数 bounce() を検索し、選択します。

    bounce() 関数には包括的ユーザー CPU 時間が表示されますが、その排他的ユーザー CPU 時間はゼロです。 これは、bounce()bounce_a() の呼び出し以外には何も行わないからです。

  2. 選択した関数 ComputeA() が「呼び出し元-呼び出し先」タブの中央区画に表示され、その呼び出し元が上部区画に表示されます。

    「呼び出し元-呼び出し先」タブには、bounce() が呼び出す関数は bounce_a() だけであることが表示されます。

  3. bounce_a() をクリックします。

    「呼び出し元-呼び出し先」タブに、bounce_a() に関する次の情報が表示されます。

  4. bounce_b() をクリックします。

    「呼び出し元-呼び出し先」タブに、bounce_b() に関する情報が表示されます。 bounce_a() は、「呼び出し元」区画と「呼び出し先」区画の両方に表示されます。 呼び出し先の起因時間は正しく示されます。これは、bounce_b() がリーフ関数ではなく、作業が行なわれる bounce_a() のインスタンスの呼び出し以降の包括時間を累積するためです。

関連項目
「呼び出し元-呼び出し先」タブ
排他的メトリック、包括的メトリック、属性メトリック


著作権と商標について