同じマシン内の AppDomains 間で通信することによるパフォーマンスの低下を最小限に抑えようとしています。私のおもちゃの例では、クラス A は AppDomain 1 にロードされます。AppDomain 2 を作成し、そこにクラス 2 (クラス 2 は MarshalByRef から継承) のインスタンスをロードして、プロキシを取得します。次に、クラス 1 は、値を返さないプロキシのメソッドを繰り返し呼び出します。
次の結果が得られます。
- AppDomain なし、両方のクラスが同じ AppDomain にロードされ、最初のメソッドが 2 番目のメソッドを繰り返し呼び出します (メソッドにはパラメーターがありません): 2,400 万メソッド呼び出し/秒
- 上記の 2 つの AppDomain、メソッドにはパラメーターがないか、「ブリーディング」文字列パラメーター: 340.000 メソッド呼び出し/秒
- 上記の 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 も試してみましたが、大きな違いはありませんでした。