【问题标题】:What is the minimum Cross AppDomain communication performance penalty?最低跨 AppDomain 通信性能损失是多少?
【发布时间】:2010-11-11 18:45:49
【问题描述】:

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

我得到以下结果:

  1. 没有 AppDomain,两个类都加载在同一个 AppDomain 中,第一个类在第二个中重复调用该方法(该方法没有参数):2400 万 个方法调用/秒
  2. 如上所述的两个 AppDomain,方法没有参数或“出血”字符串参数:340.000 个方法调用/秒
  3. 如上所述的两个 AppDomain,一个可序列化参数(两个字符串的数组):64.000 次方法调用/秒

虽然我了解 2 和 3(序列化)之间的性能损失,但我真的不明白 为什么我从案例 1 到案例 2 的速度要慢 100 倍。据我了解,一旦创建了代理,所有后续方法调用都必须非常快,因为没有数据从一个 AppDomain 编组到另一个。有人现在为什么跨 AppDomains 的通信如此缓慢?我做错了吗?

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

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

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

【问题讨论】:

    标签: c# performance appdomain


    【解决方案1】:

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

    【讨论】:

    • +1 我完全同意你的看法。一个简单的直接方法调用非常简单。通过 remoting 进行的方法调用要重得多。开销要大得多。唯一真正的解决方案是一个好的应用程序设计,它不依赖于跨 AppDomain 通信的速度。
    【解决方案2】:

    有没有什么方法可以调用单个辅助方法,该方法需要多少次你想要调用你需要的方法的参数?跨 AppDomain 调用性能因实现而异。我相信在 CLR 4.0 中它可能会更好,但我并不完全精通那里的细节。

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

    【讨论】:

    • 我看不出它对我有什么帮助。我的 A 类方法正是这样做的:不断调用 object.MyMethod()。如果在代理中调用的成本确实是调用同一 AppDomain 对象的 100 倍,那么对我的设计的影响将是巨大的。
    • 调用object.MyHelperMethod,它在另一个AppDomain中重复调用object.MyMethod。如果您需要性能并且假设/需要高速跨 AppDomain 调用,那么是的,它可能会对您的设计产生重大影响。
    • 哦,我明白了..! :-) 好的,这当然会让事情变得更快。但是这个例子只是一个玩具,我的真实程序不会每秒调用同一个函数 2000 万次..!我将不得不进行各种跨 AppDomain 调用,这些调用通常必须很快。无论如何谢谢!
    【解决方案3】:

    我看到了同样的结果。我无法解释为什么它要慢得多,只是它比运行两个不同的进程并相互通信要快。在我的设计中,我面临着类似的困境。最后,我修改了我的设计以创建独立的应用程序域;应用程序域能够完成其工作,而无需在执行期间与另一个应用程序域通信......它只会在完成时报告数据。

    【讨论】:

      猜你喜欢
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 2012-01-04
      • 2013-08-27
      相关资源
      最近更新 更多