インテル® VTune™ プロファイラー・ユーザーガイド

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);
  }
  // ここがエントリーポイント
  int main(int argc, char** argv)
  {
      if(argc < 2)
          // このアプリケーションの実行でトレースの必要がなければ、詳細ドメインを無効にする
          detailed ->flags = 0; 
      MyFunction(atoi(argv[1])); }

関連情報