質問

VC6の下でアプリケーションをプロファイリングしながら、次の問題に遭遇しています。アプリケーションをプロファイルすると、プロファイラーは、以下に似た単純なゲッターメソッドが数十万回呼ばれていることを示しています。

int SomeClass::getId() const
{
   return m_iId;
};

問題は、この方法です テストアプリのどこにも呼び出されません. 。コードを次のように変更するとき:

int SomeClass::getId() const
{
   std::cout << "Is this method REALLY being called?" << std::endl;
   return m_iId;
};

プロファイラーには含まれません getId 呼び出された関数のリスト。コメントします cout そして、私は私が始めた場所に戻って、130人以上の電話です!キャッシュされたプロファイラーデータや破損した関数ルックアップテーブルではないことを確認するために、各テストの間でクリーンで再構築しています。まだ同じ結果です!

何か案は?

役に立ちましたか?

解決

何が起こっているのかは、コンパイラおよび/またはリンカーがこの非常に単純な関数を同一の1つ以上の他の関数に対して「合体」していることだと思います( return m_iId おそらく、同じオフセットにあるメンバーを返した他の多くのゲッターとまったく同じです)。

基本的に、たまたま同一のマシンコードの実装を持っているさまざまな機能がすべて同じアドレスに解決され、プロファイラーを混乱させます。

最適化をオフにすることで、これが起こるのを防ぐことができるかもしれません(これが問題である場合)。

他のヒント

プログラムに時間がかかる方法があるかどうかを知りたいので、プロファイリングをしていると思いますよね?あなたは数字を見るのが好きなので、あなたはただプロファイリングではありません。

パフォーマンスの問題を見つけるためのシンプルで昔ながらの、実証済みの方法があります。プログラムが実行されている間に、「一時停止」ボタンを押して、コールスタックを見てください。 5〜20回など、これを数回行います。問題が大きいほど、見つける必要があるサンプルが少なくなります。

一部の人々は、これが基本的にプロファイラーが何をするかではないかと尋ねますが、答えは非常に少ないです。 ほとんどのプロファイラーは、1つ以上の一般的な神話に該当します, 、その結果、スピードアップはすべての問題が見つからないために制限されています。

  • 一部のプログラムは、「ホットスポット」で不必要な時間を費やしています。その場合、スタックの「終了」のコード(プログラムカウンターがある場所)が不必要な作業を行っていることがわかります。

  • 一部のプログラムは、必要以上にI/Oを行います。もしそうなら、あなたは彼らがそれを行う過程にあることがわかります。

  • コールツリーは不必要にふさふさしており、剪定が必要なため、大規模なプログラムはしばしば遅くなります。もしそうなら、不要な関数呼び出しが途中で呼ばれます。

スタックの一部に表示されるコードは、削除された場合、実行時間の割合を保存します(多かれ少なかれ)。間違いはありません。 これが例です, 、97%以上を節約するいくつかの反復を繰り返します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top