ITT API のオーバーヘッドを最小化する

ITT API のオーバーヘッドとアプリケーション全体へのパフォーマンスの影響は、アプリケーションに追加されるインストルメント・コードの量によって異なります。ITT API でアプリケーションをインストルメントする場合、必要なパフォーマンス・データを収集しながら API のオーバーヘッドを最小限に抑えるため、アプリケーションのパフォーマンスと収集するパフォーマンス・データの量を調整する必要があります。

インストルメントされるアプリケーション全体のパフォーマンスと、インストルメントの設定のバランスを調整するには、次のガイドラインに従ってください。

条件付きコンパイル

リリースバージョンのコードで最高のパフォーマンスを得るには、条件付きコンパイルによってアノテーションを無効にします。コンパイル時に ittnotify.h をインクルードする前に、INTEL_NO_ITTNOTIFY_API マクロを定義して、コードからすべての __itt_* 関数を排除できます。

また、このマクロを定義することでリンクステージで静的ライブラリーを排除することもできます。

使用例: ドメインと文字列ハンドルを使用

ITT API にはドメインと文字列ハンドルを作成する関数のサブセットが含まれています。これらの関数は、常にドメイン名と文字列に対して同じハンドルを返します。これらの関数は文字列の比較やテーブル参照を行う必要があるため、重大なパフォーマンスの低下を招く可能性があります。さらに、これらの関数のパフォーマンスは、作成されるドメインや文字列ハンドル数の対数に比例します。アプリケーションの起動時やグローバルスコープで、ドメインと文字列ハンドルを作成することを推奨します。

次のコードは、グローバルスコープで 2 つのドメインを作成します。これらのドメインを使用して、トレースファイルに書き込む詳細レベルを制御できます。


    __itt_domain* basic = __itt_domain_create(L"MyFunction.Basic");
    __itt_domain* detailed = __itt_domain_create(L"MyFunction.Detailed");
    // グローバルスコープで文字列ハンドルを作成
    __itt_string_handle* h_my_funcion = __itt_string_handle_create(L"MyFunction");
    void MyFunction(int arg)
    {
    __itt_task_begin(basic, __itt_null, __itt_null, h_my_function);
    Foo(arg);
    FooEx();
    __itt_task_end(basic);
    }
    __itt_string_handle* h_foo = __itt_string_handle_create(L"Foo");
    void Foo(int arg)
    {
    // ドメインの詳細が無効にされていれば、詳細トレースをスキップ
    __itt_task_begin(detailed, __itt_null, __itt_null, h_foo);
    // 処理を実行 ...
    __itt_task_end(detailed);
    }
    __itt_string_handle* h_foo_ex = __itt_string_handle_create(L"FooEx");
    void FooEx()
    {
    // ドメインの詳細が無効にされていれば、詳細トレースをスキップ
    __itt_task_begin(detailed, __itt_null, __itt_null, h_foo_ex);
    // 処理を実行 ...
    __itt_task_end(detailed);
    }
    // This is my entry point.
    int main(int argc, char** argv)
    {
    if(argc < 2)
    // アプリケーションの実行中にドメインの詳細をトレースする
    // 必要がなければ、ここで無効化します
    detailed ->flags = 0;
    MyFunction(atoi(argv[1])); 
    }

関連情報