1

C# から 2 つの C++ 関数呼び出しを呼び出しています。私のコードは以下のとおりです。

[DllImport("A.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "FuncA"), System.Security.SuppressUnmanagedCodeSecurity]
    public static extern void FuncA(UInt64 functionID);

C++ コードでは次のとおりです。

EXTERN_C void STDMETHODCALLTYPE FuncA(UINT_PTR functionId)
{
    return;
}

この関数は、C# から C++ に約 200 万回呼び出されています。この関数呼び出しがなければ、私の Web リクエストは 5.9 秒で完了します。この関数呼び出しでは、7.1 秒かかります。

約 15% のオーバーヘッド。投稿を見て、すでに「SuppressUnmanagedCodeSecurity」を使用しました。これにより、オーバーヘッドが 30% から 15% に削減されました..しかし、この 15% のオーバーヘッドを削減する他の方法はありますか??

アップデート1:

関数 ID は、C# の関数呼び出しごとに C++ に送信する必要があります。C++ 関数は空の関数ではありません。関数 ID を STL に格納する必要があり、別のスレッドがそれを処理します。私は.NETプロファイラーのようなことをしています。すべての関数呼び出しをプロファイリングする必要があります。この FuncA C++ 関数は、挿入されたヘルパー関数から呼び出されます。

ありがとう、

./ラフル

4

2 に答える 2

0

C++ 関数は何をしますか? それは本当に空のメソッドですか?実行する一連のアクションの中で必要なステップですか?

おそらく、このメソッドを C# に書き直して、そこでワークフローに組み込む方が、外部 (おそらく安全ではない) メソッドを呼び出さなくても高速です。

C++ コードによって実行されているアクションがフローの残りの部分とは何の関係もない場合は、バックグラウンド ワーカーまたは別のスレッドで実行することで、C# コードを待機させる必要がなくなるので、ある程度の時間を稼ぐことができます。コードを実行するため。メソッドが void を返すため、これは有効なオプションであると思います。

おそらく、理由と方法についてもう少し情報があれば、より適切な答えを見つけるのに役立つかもしれません.

于 2015-06-09T07:42:37.610 に答える