3

私は valgrind callgrind を使用して gtk でプログラムをプロファイリングしています。そして、kcachedgrind を使用して結果を読み取ります。ここで kcachedgrind のスクリーンショットの更新をキャプチャしました: http://i41.tinypic.com/168spk0.jpg。関数 gtk_moz_embed_new() のコストは「15.61%」でした。しかし、私はそれがどのように可能であるかを理解していません。関数 gtk_moz_embed_new() には文字通り 1 行あります: g_object_new() を呼び出しているだけです。

GtkWidget *
gtk_moz_embed_new(void)
{
  return GTK_WIDGET(g_object_new(GTK_TYPE_MOZ_EMBED, NULL));
}

結果またはkcachedgrindの使用方法を理解するのを手伝ってください。

ありがとうございました。

4

1 に答える 1

8

私の記憶が正しければ、(多かれ少なかれ)gtk_moz_embed_new()アプリの実行時間の 15.61% でその関数が実行されていたことを意味するはずです。

ご覧のとおり、その関数は、実行に時間がかかる他の関数 (またはクラスなど) へのインライン呼び出しを返します。それらがすべて完了すると、関数gtk_moz_embed_new()は実際に値を返します。main()実行に 99% の時間がかかるのとまったく同じ理由で、含まれているすべてのコードが実行された後に実行が終了します。

selfの値が 0 であることに注意してくださいgtk_moz_embed_new()。これは「排他的コスト」であり、関数自体の実行に時間がかからなかったことを意味します (実際にはリターン コールのみです)。

しかし、正確には:

1.1 「含む」の違いは何ですか? と「セルフ」?

これらは、いくつかのイベント タイプに関する関数のコスト属性です。関数は相互に呼び出すことができるため、関数自体のコスト (「自己コスト」) と、呼び出されたすべての関数を含むコスト (「包括的コスト」) を区別することは理にかなっています。「自己」は「排他的」費用と呼ばれることもあります。

したがって、たとえば main() の場合、常にほぼ 100% の包括的コストが発生しますが、実際の作業が別の関数で行われる場合、自己コストは無視できます。

于 2010-05-09T20:31:43.983 に答える