19

同じマシン内の AppDomains 間で通信することによるパフォーマンスの低下を最小限に抑えようとしています。私のおもちゃの例では、クラス A は AppDomain 1 にロードされます。AppDomain 2 を作成し、そこにクラス 2 (クラス 2 は MarshalByRef から継承) のインスタンスをロードして、プロキシを取得します。次に、クラス 1 は、値を返さないプロキシのメソッドを繰り返し呼び出します。

次の結果が得られます。

  1. AppDomain なし、両方のクラスが同じ AppDomain にロードされ、最初のメソッドが 2 番目のメソッドを繰り返し呼び出します (メソッドにはパラメーターがありません): 2,400 万メソッド呼び出し/秒
  2. 上記の 2 つの AppDomain、メソッドにはパラメーターがないか、「ブリーディング」文字列パラメーター: 340.000 メソッド呼び出し/秒
  3. 上記の 2 つの AppDomains、1 つのシリアル化可能なパラメーター (2 つの文字列の配列): 64.000 メソッド呼び出し/秒

2 と 3 (シリアライゼーション) の間のパフォーマンスの低下は理解できますが、ケース 1 からケース 2 への移行でなぜ 100 倍も遅くなるのかがよくわかりません。私の理解では、プロキシが作成されると、ある AppDomain から別の AppDomain にデータがマーシャリングされないため、後続のすべてのメソッド呼び出しは非常に高速でなければなりません。AppDomains 間の通信が非常に遅い理由はありますか? 私は何か間違ったことをしていますか?

PS1。これに関する唯一のヒントは次のとおりです。「AppDomain の境界を超えるコストは恥ずかしい」私は彼が連載を指していると推測していました...

PS2。AppDomain または Proxy の作成時間はカウントしません (私のベンチマークは最初のメソッド呼び出しで開始されます)

PS3。WinXP SP3 マシンで .NET 3.5 を使用しています。.NET 4.0 Beta 1 も試してみましたが、大きな違いはありませんでした。

4

3 に答える 3

12

各シナリオに含まれる IL の行を数えると、CLR がリモート処理の 100 倍以上の作業を行っていることがわかります。直接呼び出しはほんの数個のオペコードにすぎませんが、リモーティングには複数のクラス、リアル/トランスペアレント プロキシ、セキュリティ チェック、シリアライゼーション、yadda yadda yadda が関係しています。設計を通じてこれに対処する必要があります。実装によってパフォーマンスを向上させる特効薬はありません。

于 2009-09-03T22:38:28.717 に答える
1

必要なメソッドを何回呼び出したいかについてパラメーターを取る単一のヘルパー メソッドを呼び出す方法はありますか? Cross-AppDomain 呼び出しのパフォーマンスは、実装によって大きく異なります。CLR 4.0 では大幅に改善される可能性があると思いますが、詳細については完全には理解していません。

ただし、一般的には、ヘルパー メソッドを使用して呼び出しを「バッチ処理」することにより、オーバーヘッドを回避する必要があります。

于 2009-07-17T16:50:15.943 に答える
0

私は同じ結果を見てきました。2 つの異なるプロセスを実行して相互に通信するよりも高速であることを除けば、なぜこれほど遅いのか説明できません。私の設計では、同様のジレンマに直面しました。最後に、独立したアプリ ドメインを作成するように設計を変更しました。アプリ ドメインは、実行中に別のアプリ ドメインと通信する必要なく、その仕事を行うことができました...完了したときにのみデータを報告します。

于 2009-08-19T10:46:08.310 に答える