我试图将在同一台机器上跨 AppDomain 进行通信的性能损失降到最低。在我的玩具示例中,A 类加载到 AppDomain 1 中。它创建一个 AppDomain 2 并在那里加载一个类 2 的实例(类 2 继承自 MarshalByRef)以获取代理。然后类 1 重复调用代理上的一个不返回值的方法。
我得到以下结果:
- 没有 AppDomain,两个类都加载在同一个 AppDomain 中,第一个类重复调用第二个方法(该方法没有参数):2400 万次方法调用/秒
- 如上所述的两个 AppDomain,方法没有参数或“出血”字符串参数:340.000 个方法调用/秒
- 如上所述的两个 AppDomain,一个可序列化参数(两个字符串的数组):64.000 次方法调用/秒
虽然我了解 2 和 3 (序列化)之间的性能损失,但我真的不明白为什么我从 case 1 到 case 2 慢了 100 倍。据我了解,一旦创建了代理,所有后续方法调用都必须非常快,因为没有数据从一个 AppDomain 编组到另一个。有人现在为什么跨 AppDomains 的通信如此缓慢?难道我做错了什么?
PS1。我对此的唯一提示是: “跨越 AppDomain 边界的成本令人尴尬。”。我猜他指的是序列化......
PS2。我不计算 AppDomain 或代理创建时间(我的基准测试从第一个方法调用开始)
PS3。我在 WinXP SP3 机器上使用 .NET 3.5。我还尝试了没有显着差异的 .NET 4.0 Beta 1。