gpt4 book ai didi

c# - 最小的跨 AppDomain 通信性能损失是多少?

转载 作者:IT王子 更新时间:2023-10-29 04:44:29 24 4
gpt4 key购买 nike

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

我得到以下结果:

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

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

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

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

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

最佳答案

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

关于c# - 最小的跨 AppDomain 通信性能损失是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1144459/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com