5

valgrindを使用してコードを分析したいと考えています。問題は、興味のない巨大な起動シーケンスがあることです。

valgrind/callgrind.hで定義が見つかりました。

  • CALLGRIND_START_INSTRUMENTATION
  • CALLGRIND_STOP_INSTRUMENTATION
  • CALLGRIND_DUMP_STATS

この記事によると、次のオプションでvalgrindを実行する必要があります。

valgrind --tool=callgrind --instr-atstart=no ./application

これを行うと、次の 2 つのファイルが作成されます。

  • callgrind.out.16060
  • callgrind.out.16060.1

次に、kcachegrind を使用して結果を視覚化します。これはうまく機能しますが、スタートアップ シーケンスをスキップするためのマクロは何もしていないようです。測定したい場所だけでパフォーマンスを測定するにはどうすればよいですか?

4

2 に答える 2

0

今はわかりましたが、理由は 100% わかりません。私のコードを少し説明しようとします:

多くのサブシステムを担当する Application クラスがあります。私の最初の試みでは、次のようにアプリケーション内のパフォーマンスを測定しようとしました:

int main(int argc, char *argv[])
{
    Application a(argc, argv);
    return a.exec();
}

void Application::Application(int &argc, char **argv)
{
    m_pComplexSystem = new ComplexSystem();
    m_pComplexSystem->configure();

    CALLGRIND_START_INSTRUMENTATION;
    m_Configurator->start();    
}

Application::~Application()
{
    CALLGRIND_STOP_INSTRUMENTATION;
    CALLGRIND_DUMP_STATS;
    m_pComplexSystem ->stop();

    delete m_pComplexSystem;
    m_pComplexSystem = 0;
}

何らかの理由で定義が無視され、コンストラクター全体と、ComplexSystem メンバーの configure() 呼び出しで行われたすべてのパフォーマンス測定値を取得しました。

だから今、私はうまくいくように見えるこのコードを使用します:

int main(int argc, char *argv[])
{
    Application a(argc, argv);

    CALLGRIND_START_INSTRUMENTATION;
    int result = a.exec();
    CALLGRIND_STOP_INSTRUMENTATION;
    CALLGRIND_DUMP_STATS;
    return result;
}

最初の試みとまったく同じではありませんが、これで遅い関数を探し始めることができます。

于 2015-10-02T11:21:37.313 に答える