既存のネイティブ C++ アプリケーションに次の機能を追加しました。
- サード パーティの DLL が LoadLibraryA(...) 経由で読み込まれます。
- 関数ポインターは、GetProcAddress(...) を介して DLL から取得されます。
- 関数が呼び出されます
これは基本的に機能しますが (関数は alight と呼ばれ、期待される出力を生成します)、大きな問題が 1 つあります。それは、(3. の) 関数呼び出しが非常に遅いことです。実行には 300 ミリ秒以上 (!) かかりますが、1 ミリ秒未満である必要があります。
そこで、新しい空の C++ アプリケーションを作成し、コードをコピーしました。したがって、手順 1 ~ 3 は、他のアプリケーションとまったく同じ方法で実行されます。関数は同じことを行い、同じ結果を生成します。しかし、実行ははるかに高速で、予想どおり 1 ミリ秒未満です。
私が行ったいくつかの観察:
- どちらの結果も 100% 再現可能です。
- 両方のアプリケーションのコンパイラ/リンカー設定は同じようです。
- どちらのアプリケーションでも、コードは CPU 使用率が非常に低いときにメイン スレッドで実行されるため (他に多くのことが行われていないため)、スレッド化/パフォーマンスの問題は問題ではないようです。また、結果は再現可能であり、この種のタイミングの問題は除外されます。
- DLL へのすべての呼び出しは、最初のアプリケーションでは少なくとも 300 ミリ秒かかりますが、他のアプリケーションでは高速です。したがって、動作は単一の機能に限定されません。
- デバッグ ビルドとリリース ビルドのどちらを使用しても違いはありません。
- アプリケーションとサードパーティの DLL はどちらも 32 ビットです。
だから今、私はまったく同じことをしているときに両方のアプリケーションの動作が非常に異なる原因となる可能性のあるアイデアを探しています.