什么是最低Cross AppDomain通信性能损失?

时间:2009-07-17 16:44:54

标签: c# performance appdomain

我正在尝试最小化在同一台计算机上跨AppDomain进行通信的性能损失。在我的玩具示例中,A类在AppDomain 1中加载。它创建一个AppDomain 2并在那里加载一个Class 2实例(Class 2继承自MarshalByRef)获取代理。然后,Class 1在代理上重复调用一个不返回值的方法。

我得到以下结果:

  1. 没有AppDomains,这两个类都加载在同一个AppDomain中,第一个调用第二个方法(该方法没有参数): 2400万方法调用/秒
  2. 如上所述的两个AppDomain,方法没有参数或“出血”字符串参数: 340.000方法调用/秒
  3. 如上所述的两个AppDomains,一个可序列化参数(两个字符串的数组): 64.000方法调用/秒
  4. 虽然我理解2和3(序列化)之间的性能损失,但我真的不明白为什么我从案例1到案例2的速度慢100倍。据我所知,一旦创建了代理,所有后续的方法调用必须非常快,因为没有数据从一个AppDomain编组到另一个AppDomain。现在有人为什么要通过AppDomains进行通信这么慢?我做错了吗?

    PS1。我对此的唯一提示是here:“跨越AppDomain边界的成本令人尴尬。”我猜他指的是序列化......

    PS2。我不计算AppDomain或代理创建时间(我的基准测试从第一个方法调用开始)

    PS3。我在WinXP SP3机器上使用.NET 3.5。我也尝试过.NET 4.0 Beta 1,但没有显着差异。

3 个答案:

答案 0 :(得分:11)

如果计算每个场景中涉及的IL行,您将看到CLR在远程处理时的工作量超过100倍。直接调用只是一些操作码,但是通过远程处理,涉及多个类,真实/透明代理,安全检查,序列化,yadda yadda yadda。您需要通过设计来解决这个问题 - 通过实施来提高性能没有灵丹妙药。

答案 1 :(得分:1)

有没有办法可以调用单个辅助方法来获取有关您想要调用所需方法的次数的参数?跨AppDomain呼叫性能因实施而异。我相信它在CLR 4.0中可能会明显更好,但我并不完全了解那里的细节。

通常,您希望通过辅助方法“批处理”调用来避免开销。

答案 2 :(得分:0)

我看到了同样的结果。我无法解释为什么它这么慢,除了它有两个不同的进程运行和相互通信更快。在我的设计中,我面临着类似的困境。最后,我修改了我的设计以创建独立的应用程序域;应用程序域无需在执行期间与其他应用程序域通信即可完成其工作...它只会在完成时报告数据。