我试图最小化在同一台机器上跨越AppDomains通信的性能惩罚。在我的示例中,Class A被加载到AppDomain 1中。它创建了一个AppDomain 2,并在那里加载了一个继承自MarshalByRef的Class 2实例,获取了代理并返回。然后Class 1反复调用代理上的一个无返回值方法。
我得到以下结果:
PS1. 我唯一的提示是这里:“跨越AppDomain边界的成本令人尴尬。”我猜他是指序列化...
PS2. 我不计算AppDomain或代理创建时间(我的基准从第一个方法调用开始)
PS3. 我在WinXP SP3机器上使用.NET 3.5。我也尝试过.NET 4.0 Beta 1,没有显着差异。
我得到以下结果:
- 没有AppDomains,两个类都加载在同一个AppDomain中,第一个重复地调用第二个的方法(该方法没有参数):2400万次方法调用/秒
- 两个如上所述的AppDomain,方法没有参数或"bleeding"字符串参数:34万次方法调用/秒
- 两个如上所述的AppDomain,一个可序列化的参数(包含两个字符串的数组):6.4万次方法调用/秒
PS1. 我唯一的提示是这里:“跨越AppDomain边界的成本令人尴尬。”我猜他是指序列化...
PS2. 我不计算AppDomain或代理创建时间(我的基准从第一个方法调用开始)
PS3. 我在WinXP SP3机器上使用.NET 3.5。我也尝试过.NET 4.0 Beta 1,没有显着差异。