コードでstd::mapを使用していますが、デバッグビルドでは、それを使用するコードの実行がリリースよりも許容できないほど遅くなります。この答えは、これは
Microsoft Visual Studioでは、デバッグビルドでのマルチスレッドの問題から保護するために、標準C++ライブラリにアクセスするときにグローバルロックがあります。
ただし、そのグローバルミューテックスロックを無効にする方法については詳しく説明していません。それを行う方法はありますか?
コードでstd::mapを使用していますが、デバッグビルドでは、それを使用するコードの実行がリリースよりも許容できないほど遅くなります。この答えは、これは
Microsoft Visual Studioでは、デバッグビルドでのマルチスレッドの問題から保護するために、標準C++ライブラリにアクセスするときにグローバルロックがあります。
ただし、そのグローバルミューテックスロックを無効にする方法については詳しく説明していません。それを行う方法はありますか?
一般的に、STL を使用したデバッグ ビルドが遅いことが問題である場合は、イテレータ デバッグをオフにしてみます。私の知る限り、これはリリース ビルドとデバッグ ビルドの間の大きなスローダウンの 1 つです。関連する#define
ものは次のとおりです。
#define _HAS_ITERATOR_DEBUGGING 0
私の知る限り、ランタイム ライブラリ内のデバッグ チェックの一部はおそらく (そしてほとんどの場合実行できない) スレッド セーフであり、追加のチェックを行うには、グローバルロック。
経験から、デバッグ ランタイムがかなり遅いことはわかっていますが、多くの場合、追加のランタイム チェックは価値があります。また、ランタイムを非難する前にコードにプロファイラーを向けます-フラグを微調整しない限り、デバッグコードは最適化されずに実行され、その結果、コンパイラーがあなたが指示したことを実行したため、コードのパフォーマンスの問題が拡大されます:) .
とはいえ、追加のランタイム チェックを差し控える場合、これを回避するために使用できるオプションの 1 つは、リリース ランタイムに対してデバッグ バージョンをビルドすることです。私はかなり長い間それを試していませんでしたが、最後にこれを試したときはうまくいき、許容できないほど遅いコードがより耐えられるようになるかもしれません.