我们开发了一些与DB队列配合使用的系统,以及哪些组件位于单独的Windows服务中。我们有一个想法,即在单个可执行文件中执行所有组件,但是在单独的AppDomain中。主要目的是防止整个系统在单个组件崩溃时崩溃。
在执行少量测试后,我们遇到了Cross-AppDomain调用太慢的问题。我尝试使用强名称对程序集进行签名并将它们放到GAC并应用LoaderOptimization.MultiDomain(Host),但性能仍然不可接受:简单的单个AppDomain调用和每秒90 000个调用的14 000 000个呼叫/秒在跨域呼叫模式下。在应用程序中,执行两个调用:第一个从默认AppDomain到非默认AppDomain,第二个调用 - 在相反方向。 90 000个调用/秒是非常好的结果,但考虑到测试应用程序的简单性,并且在将系统的复杂性投射到多个AppDomain方法后,我们发现它太慢了。
主要问题是:有没有办法显着加快跨域调用?也许可以消除某种检查?
代码:
class Program
{
public class TestMessage : MarshalByRefObject { }
public class TestClass : MarshalByRefObject
{
private TestClass() { }
public void TestMethod(TestMessage message) { }
public static TestClass Create(bool defaultDomain)
{
if (defaultDomain)
{
return TestClass.createDefaultDomain();
}
return TestClass.createInNewDomain();
}
private static TestClass createDefaultDomain()
{
return new TestClass();
}
private static TestClass createInNewDomain()
{
AppDomain appDomain = AppDomain.CreateDomain("NewDomain");
return appDomain.CreateInstance(
typeof(TestClass).Assembly.FullName,
typeof(TestClass).FullName,
true, BindingFlags.NonPublic | BindingFlags.Instance,
null, null, null, null)
.Unwrap() as TestClass;
}
}
[STAThread]
[LoaderOptimization(LoaderOptimization.MultiDomain)]
static void Main(string[] args)
{
TestClass testClass = TestClass.Create(true);
TestMessage message = new TestMessage();
int calls = 0;
Stopwatch sw = Stopwatch.StartNew();
while (sw.ElapsedMilliseconds < 10000)
{
testClass.TestMethod(message);
calls++;
}
sw.Start();
Console.WriteLine("{0:N3}", calls / sw.Elapsed.TotalSeconds);
}
}
答案 0 :(得分:0)