【发布时间】:2011-12-24 17:29:49
【问题描述】:
根据this article,带有命名管道的 WCF 是 IPC 的最佳选择,它比 .Net Remoting 快约 25%。
我有以下代码将 WCF 与命名管道与 .Net Remoting 进行比较:
[ServiceContract]
internal interface IRemote
{
[OperationContract]
string Hello(string name);
}
[ServiceBehavior]
internal class Remote : MarshalByRefObject, IRemote
{
public string Hello(string name)
{
return string.Format("Hello, {0}!", name);
}
}
class Program
{
private const int Iterations = 5000;
static void Main(string[] args)
{
TestWcf(Iterations);
TestRemoting(Iterations);
TestWcf(Iterations);
TestRemoting(Iterations);
TestWcf(Iterations);
TestRemoting(Iterations);
Console.ReadKey();
}
private static void TestRemoting(int iterations)
{
var domain = AppDomain.CreateDomain("TestDomain");
var proxy =
(IRemote)
domain.CreateInstanceFromAndUnwrap(Assembly.GetEntryAssembly().Location, "ConsoleApplication6.Remote");
Console.WriteLine("Remoting: {0} ms.", Test(proxy, iterations));
}
private static void TestWcf(int iterations)
{
var address = "net.pipe://localhost/test";
var host = new ServiceHost(typeof (Remote));
host.AddServiceEndpoint(typeof (IRemote), new NetNamedPipeBinding(), address);
host.Open();
var proxy = ChannelFactory<IRemote>.CreateChannel(new NetNamedPipeBinding(), new EndpointAddress(address));
Console.WriteLine("Wcf: {0} ms.", Test(proxy, iterations));
host.Close();
}
private static double Test(IRemote proxy, int iterations)
{
var start = DateTime.Now;
for (var i = 0; i < iterations; i++)
{
proxy.Hello("Sergey");
}
var stop = DateTime.Now;
return (stop - start).TotalMilliseconds;
}
}
A 在 5000 次迭代中得到以下结果:
Wcf: 14143 ms.
Remoting: 2232 ms.
Wcf: 14289 ms.
Remoting: 2130 ms.
Wcf: 14126 ms.
Remoting: 2112 ms.
在此测试中,Wcf 比 .Net Remoting 慢 7 倍左右。
我尝试过:
- 将安全模式设置为无;
- 将 InstanceContextMode 设置为 Single/PerCall;
- 将 ConcurrencyMode 设置为 Single/Multiple;
但结果是一样的。
有人知道我做错了什么吗?为什么 WCF 这么慢?
有没有办法加快这段代码的速度?
提前致谢。
编辑:
我稍微修改了测试。合同是一样的。
第一个测试看起来像这样(Wcf 测试):
class Program
{
private const int Iterations = 5000;
static void Main(string[] args)
{
var address = "net.pipe://localhost/test";
var host = new ServiceHost(typeof(Remote));
host.AddServiceEndpoint(typeof(IRemote), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), address);
host.Open();
var proxy = ChannelFactory<IRemote>.CreateChannel(new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), new EndpointAddress(address));
TestWcf(proxy, Iterations);
TestWcf(proxy, Iterations);
TestWcf(proxy, Iterations);
TestWcf(proxy, Iterations);
TestWcf(proxy, Iterations);
Console.ReadKey();
host.Close();
}
private static void TestWcf(IRemote proxy, int iterations)
{
var start = DateTime.Now;
for (var i = 0; i < iterations; i++)
{
proxy.Hello("Sergey");
}
var stop = DateTime.Now;
Console.WriteLine("Wcf: {0} ms.", (stop - start).TotalMilliseconds);
}
}
结果如下:
Wcf: 2564 ms.
Wcf: 1026 ms.
Wcf: 986 ms.
Wcf: 990 ms.
Wcf: 992 ms.
第二个测试看起来像这样(.Net Remoting 测试):
class Program
{
private const int Iterations = 5000;
static void Main(string[] args)
{
var domain = AppDomain.CreateDomain("TestDomain");
var proxy =
(IRemote)
domain.CreateInstanceFromAndUnwrap(Assembly.GetEntryAssembly().Location, "ConsoleApplication6.Remote");
TestRemoting(proxy, Iterations);
TestRemoting(proxy, Iterations);
TestRemoting(proxy, Iterations);
TestRemoting(proxy, Iterations);
TestRemoting(proxy, Iterations);
Console.ReadKey();
}
private static void TestRemoting(IRemote proxy, int iterations)
{
var start = DateTime.Now;
for (var i = 0; i < iterations; i++)
{
proxy.Hello("Sergey");
}
var stop = DateTime.Now;
Console.WriteLine("Remoting: {0} ms.", (stop - start).TotalMilliseconds);
}
}
结果如下:
Remoting: 261 ms.
Remoting: 224 ms.
Remoting: 252 ms.
Remoting: 243 ms.
Remoting: 234 ms.
如您所见,.Net Remoting 再次变得更快。测试在调试器之外运行。
为什么会这样?
【问题讨论】:
-
你能提供你的配置文件吗?
-
villecoder:我不使用配置。绑定、端点、行为在代码中设置。
标签: c# wcf named-pipes .net-remoting