什么是最小交叉AppDomain的通信性能的惩罚?(What is the minimum Cros

2019-06-26 05:28发布

我想,以尽量减少在同一台机器上跨应用程序域通信的性能损失。 在我的玩具例如,A类是在应用程序域1.装载它创建取回一个代理一个AppDomain 2和负载有2类(类源于MarshalByRef 2个继承)的实例。 然后第1类多次呼吁没有返回值的代理的方法。

我得到如下结果:

  1. 没有应用程序域,这两个类是在相同的应用程序域加载和第一呼叫repetedly所述方法在所述第二(该方法没有参数):24000000方法调用/秒
  2. 如上所述的两个应用程序域,方法没有参数或“渗色”的字符串参数:340.000方法调用/秒
  3. 两个应用程序域,如上所述,一个序列化参数(两个字符串的数组):64.000方法调用/秒

虽然我明白2和3(序列化)之间的性能损失,我真的不明白,为什么我是速度较慢的情况下,从1到2的情况下的100倍 。 我的理解是,一旦代理创建所有后续的方法调用必须是非常快,因为没有数据正在整理从一个AppDomain中的其他。 现在有谁为什么跨应用程序域通信速度如此之慢? 难道我做错了什么?

PS1。 我对这个唯一的技巧是在这里 :“与跨越一个AppDomain边界的成本是令人尴尬的。” 我猜测他指的序列化...

PS2。 我不指望在AppDomain或代理创建时间(我的基准在第一个方法调用开始)

PS3。 我在WinXP中SP3机使用.net 3.5。 我也尝试过.NET 4.0 Beta 1中,没有显著差异。

Answer 1:

如果算上参与每个方案IL的线,你会看到CLR做多的远程处理工作时的100倍以上。 直接调用是短短的操作码,但远程有涉及多个类,真正/透明代理,安全检查,序列化,yadda内容非常重要。 您将需要通过设计来解决这个问题 - 有没有灵丹妙药通过实施改善PERF。



Answer 2:

有什么办法可以调用一个辅助方法需要你想多少次打电话给你所需要的方法参数? 跨AppDomain的通话性能通过实施差别很大。 我认为可能是在CLR 4.0显著好,但我不完全在细节上有精通。

但是总的来说,要避免“配料”的通过辅助方法调用的开销。



Answer 3:

我已经看到了同样的结果。 我无法解释为什么它是如此慢得多,但它是更快然后有两个不同的进程运行,并且互相通信。 在我的设计,我面临着类似的困境。 最后,我已经修改了我的设计,创造独立应用程序域; 应用程序域是能够完成自己的工作,而无需执行过程中与其他应用程序域通信...完成后它只会报告数据。



文章来源: What is the minimum Cross AppDomain communication performance penalty?