テクノロジー : 関数レベルのプロファイリング

ARTICLE BY:
POSTED:

TAGS:

SN Systemsパフォーマンス解析チームの技術リーダーとして、お客様を訪問し、お客様からのフィードバックや機能追加リクエストを持ち帰り、それを最良のツール作成に役立てることが、私の仕事のひとつです。

Razorをお使い頂いている方からお受けする質問で一番多いのが、「最も呼び出されることの多い関数はどれですか?それはなぜですか?」というものです。

今回は、私たちが提供する機能を紹介しながら、この質問に答えてみたいと思います。

PCサンプリング

Razorパフォーマンス解析ツールには、PC (Program Counter: プログラム カウンタ) サンプリングという機能が搭載されています。この機能は、実行回数が最も多い関数 (「hot」関数とも呼ば れます) がどれであるかを示すものです。

PCサンプリングでは、プログラムカウンタがどの関数に属しているかを定期的に確認することによってパフォーマンスを計測します。そして、各関数にプログラムカウンタが何回あるのかを記録して、アプリ ケーションのパフォーマンスを図式化します。

以下のスクリーンショットの暗い緑色のバーは、サンプリング中にPCがどの関数に属していたかを示しています (doWorkA() および doWorkB() は例です)。

Razor showing PC samples

PCサンプリングの統計情報を見ると、アプリケーションの全体的なパフォーマンスを把握できます。ただし、場合によっては、各関数の正確なタイミングを知りたいこともあります。そこで、関数レベルのプロファイリング、すなわち、関数インストルメンテーションを行います。

関数への計測コード挿入(関数インストルメンテーション)

PlayStation®Vita DevKitなど、ハードウェアによっては、侵入のないハードウェア トレースがサポートされているものがあり、あらゆる関数の絶対タイミングを得ることができます。そのために、ゲーム へのランタイム コストを一切かけずに詳細なコール グラフやタイムライン データが作成できます。

SNでは、この機能をサポートしていないハードウェアに対応すべく、当初、PlayStation®2およびPlayStation®3のCPUプロファイラに実装していたテクノロジーを進化させました。これが関数への計測コード挿入です。

関数への計測コード挿入では、ランタイム中に、関数の最初と最後にプロファイリング データを出力するコードを使って、関数にパッチを当てます。これにより、各関数が実行されるごとに絶対タイミン グを得ることができます。このプロセスはランタイム中に実行されるため、デバッグ ビルドとリリース ビルドの両方で使用できます。

イン

ストルメンテーション・ビフォー&アフター

この方法でコードにパッチを当てると、各関数が厳密に何回呼び出されたのか、実行にどれだけの時間がかかったのかが把握できるため、PCサンプリング メソッドも改善されます。

関数の正確なタイミングがわかれば、コードのどこを最適化できるか、また最適化すべきかを見極めることができます。また、各コードのイテレーションに関数計測コード挿入機能を使用すれば、コ ードの変更がアプリケーションのパフォーマンスに悪影響を与えていないかも監視できます。

ゲーム開発業界では、数マイクロ秒の違いが、60 fpsなのか、30 fpsなのかといった大きな差を生みます。そんな業界では、関数への計測コード挿入から得られる精緻度が必要不可欠なので す。

トップに戻る