2009-07-17 8 views
18

同じマシンのAppDomains間で通信する際のパフォーマンスの低下を最小限に抑えようとしています。私のおもちゃの例では、クラスAはAppDomain 1に読み込まれます。AppDomain 2を作成し、クラス2のインスタンス(クラス2はMarshalByRefから継承します)をロードしてプロキシを返します。次に、クラス1は、値を返さないプロキシのメソッドを繰り返し呼び出します。両方のクラスが同じのAppDomainにロードされ、最初の呼び出しは(メソッドはパラメータはありません)は、第2の上の方法をrepetedly、Cross AppDomainの最小の通信パフォーマンスペナルティは何ですか?

  1. ないのAppDomain:2400万方法を

    は、私は次のような結果を得ますコール/秒

  2. つのアプリケーションドメイン上述したように、この方法は、パラメータはありませんか、文字列パラメータ「出血」:340.000方法を2つの文字列の配列(/秒上記のよう
  3. 二つのアプリケーションドメイン一個のシリアライズパラメータを呼び出しS):私は2と3(直列化)間のパフォーマンスの低下を理解しますが、私はケース2にケース1から遅くなる100回午前なぜ64.000メソッド呼び出し/秒

、私は本当にを理解していません。私の理解では、一度プロキシが作成されると、データが1つのAppDomainから他のAppDomainにマーシャリングされていないので、その後のすべてのメソッド呼び出しが本当に速くなければなりません。誰も今AppDomainsを介して通信するのがなぜそんなに遅いのですか?私は何か間違っているのですか?

PS1。私がこれで持っている唯一のヒントはhereです: "そして、AppDomain境界を越えるコストは恥ずかしいです。"私は彼が逐次化に言及していると推測していた。

PS2。私はAppDomainまたはプロキシの作成時間をカウントしません(私のベンチマークは最初のメソッド呼び出しから始まります)

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

答えて

11

各シナリオに関係するILの行数をカウントすると、リモーティング時にCLRが100倍以上の仕事をしていることがわかります。直接呼び出しはほんの数個のオペレーションコードですが、リモーティングには複数のクラス、実際の/トランスペアレントなプロキシ、セキュリティチェック、シリアル化、yadda yadda yaddaがあります。あなたは設計を通してこれに対処する必要があります - 実装を通してperfを改善するための魔法の弾丸はありません。

+1

+1私はあなたに完全に同意します。簡単な直接メソッド呼び出しは非常に簡単です。 ** remoting **によるメソッド呼び出しは、はるかに重くなります。オーバーヘッドははるかに大きいです。実際の唯一の解決策は、AppDomainの通信の速度に依存しない優れたアプリケーション設計です。 – jpbochi

1

必要なメソッドを何回呼び出したいかに関するパラメータを取る単一のヘルパーメソッドを呼び出す方法はありますか?クロスAppDomainコールのパフォーマンスは実装によって大きく異なります。私はそれがCLR 4.0ではるかに良いかもしれないと信じていますが、私はそこの詳細に完全に精通していません。

しかし、一般的には、ヘルパーメソッドを使用してコールを「バッチ処理」することでオーバーヘッドを避けたいと考えています。

+0

私はそれが私を助ける方法を見ません。私のクラスAのメソッドはそれを正確に行います:object.MyMethod()を連続的に呼び出します。プロキシの呼び出しのコストが同じAppDomainオブジェクトの呼び出しの100倍も大きい場合、私の設計の影響は大きくなります。 – Yiannis

+3

他のAppDomainでobject.MyMethodを繰り返し呼び出すobject.MyHelperMethodを呼び出します。あなたがパフォーマンスを必要とし、AppDomainを高速でクロスコールすることを前提としている場合は、設計に大きな影響を与える可能性があります。 –

+0

ああ、そうだよ! :-)これはもちろん、高速化します。しかし、この例はちょうどおもちゃです、私の実際のプログラムは、毎秒20万回の同じ機能を呼び出すことはありません..!私は一般的に速くなければならない様々なクロスAppDomainコールを行う必要があります。とにかくThnanks! – Yiannis

0

私は同じ結果を見ました。私はなぜそれがずっと遅いのかを説明することはできませんが、2つの異なるプロセスを実行してお互いに通信する方が速いという点を除いては説明できません。私のデザインでは、同様のジレンマに直面していました。最後に、独立したアプリドメインを作成するようにデザインを変更しました。アプリケーションドメインは、実行中に別のアプリドメインと通信する必要なく、仕事を実行することができました。完了したらデータのみをレポートします。

関連する問題