WCF vs. .Net Remoting

前端 未结 4 1861
遥遥无期
遥遥无期 2021-01-30 13:50

according to this article, WCF with named pipes is the best choice for IPC, and it is around 25 % faster than .Net Remoting.

I have the following code that compares WCF

相关标签:
4条回答
  • 2021-01-30 14:29

    If, in addition to SSamra's code, you move the creation of your host outside of your WCF test (since, in my opinion you should only be creating the host just once) you can get even faster responses:

    static void Main(string[] args)
    {
        var address = "net.pipe://localhost/test";
    
        host = new ServiceHost(typeof(Remote));
        host.AddServiceEndpoint(typeof(IRemote), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), address);
        host.Open();
    
        proxy = ChannelFactory<IRemote>.CreateChannel(new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), new EndpointAddress(address));
    
        TestWcf(Iterations);
        TestRemoting(Iterations);
    
        TestWcf(Iterations);
        TestRemoting(Iterations);
    
        TestWcf(Iterations);
        TestRemoting(Iterations);
    
        host.Close();
    
        Console.ReadKey();
    }
    

    Responses: enter image description here

    This shows that, when configured like this, WCF in process is significantly faster than .Net remoting!

    0 讨论(0)
  • 2021-01-30 14:36
    Wcf: 261,03 ms.
    Wcf: 247,02 ms.
    Wcf: 236,02 ms.
    Wcf: 235,02 ms.
    Wcf: 236,02 ms.
    
    WCF NetNamedPipeBinding done. Avg : 243,02
    
    Wcf: 508,05 ms.
    Wcf: 467,05 ms.
    Wcf: 484,05 ms.
    Wcf: 458,05 ms.
    Wcf: 458,05 ms.
    
    WCF NetTcpBinding done. Avg : 475,05
    
    Remoting: 35,00 ms.
    Remoting: 58,01 ms.
    Remoting: 35,00 ms.
    Remoting: 35,00 ms.
    Remoting: 34,00 ms.
    
    Remoting done. Avg : 39,40
    
    0 讨论(0)
  • 2021-01-30 14:48

    Debuggers are not real measure when try to compare the performance , here is what I did and got WCF Kicking out Remoting from the ring ;)

    1) Also modified your test to run it from same program/exe

      namespace ConsoleApplication6
    {
      [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[] p)
        {
          TestWcf();
          TestRemoting();
        }
    
    
        static void TestWcf()
        {
          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.WriteLine("WCF done");
    
          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);
        }
    
        static void TestRemoting()
        {
          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.WriteLine("Remoting done");
          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);
        }
      }
    
    }
    

    2) Compile it in release mode and ran it outside debugger.

    here is my output enter image description here

    0 讨论(0)
  • 2021-01-30 14:54

    The MSDN article you refer to at the start of your question compares Remoting with WCF NetNamedPipes as an IPC mechanism (meaning Inter-Process Communication, not Intra-Process Communication). Your test code is comparing performance for communication within the same process.

    It is my understanding that WCF's designers had a goal of substantially beating all pre-existing remoting technologies for performance, in all cross-network and cross-process scenarios, but not necessarily cross-domain within the same process. In fact I think they have got fairly close to Remoting performance in the cross-domain scenario too, as other answerers have indicated. But you should not be surprised if you don't get a performance gain from using WCF in this particular scenario.

    It is not a reason to doubt WCF's superior performance for Inter-Process Communication.

    0 讨论(0)
提交回复
热议问题