zoukankan      html  css  js  c++  java
  • .NET Remoting三种信道Http,Tcp,IPC和Web Service的访问速度比较(转)

      Remoting和Web Service是.net中的重要技术,都可用来实现分布式系统开发,如果是不同的平台就只能选择Web Service,但如果是同一平台,就都可以选择了。到底选择那种,当然还有访问效率上的考虑,同时在Remoting中又有三中信道 Http,Tcp,Ipc,它们又各有差别。HTTP方式的信道在跨越防火墙上有优势;TCP方式的信道常用在局域网内通信,速度比HTTP快很 多;IPC信道用于同一台机器的进程间通信,通信不占用网络资源,速度又比TCP快很多。为了能够实际的比较一下这四者的实际访问速度,我写了个小程序用 测试。这个程序的实现很简单利用Remoting三种信道和Web Service 访问同一个对象(相当于实际项目中的业务层),而这个对象实现返回系统的时间。就这么简单。如果有对Remoting和Web Service不太了解的,也可以通过我这个例子熟悉一下Remoting三种信道的写法差别和Web Service的调用。

         下面是程序运行的界面,我使用.net中的最小时间度量:刻度(用毫秒在本机上可能都很难测出它们之间的差别),来测试每次调用所发的时间,并通过多次调 用来测的一个平均时间来比较访问的速度。通过测试可以看得出他们四者得访问速度:ipc>tcp>http>Web Service.(其实Remoting的http信道和Web Service的访问速度还有待比较,跟测试的主机还有一定关系,在我办公室里的一台电脑上好像Web service的访问速度更快于http信道),大家可以自己测试一下,或研究一个比较好的方法。

    相关代码:

      1     //使用Http信道
      2     public void Http()
      3     {
      4       Stopwatch stopWatch = new Stopwatch();
      5       stopWatch.Start();
      6       MyObject myObj = (MyObject)Activator.GetObject(typeof(MyObject), "http://localhost:9001/MyObject");
      7       myObj.GetServerTime();
      8       stopWatch.Stop();
      9       lsbHttp.Items.Add(stopWatch.ElapsedTicks);
     10     }
     11      //使用Tcp信道
     12     public void Tcp()
     13     {
     14         Stopwatch stopWatch = new Stopwatch();
     15         stopWatch.Start();
     16         MyObject myObj = (MyObject)Activator.GetObject(typeof(MyObject), "tcp://localhost:9002/MyObject");
     17         myObj.GetServerTime();
     18         stopWatch.Stop();
     19         lsbTcp.Items.Add(stopWatch.ElapsedTicks);
     20     }
     21      //使用Ipc信道
     22     public void Ipc()
     23     {
     24       Stopwatch stopWatch = new Stopwatch();
     25       stopWatch.Start();
     26       MyObject myObj = (MyObject)Activator.GetObject(typeof(MyObject), "Ipc://MyHost/MyObject");
     27       myObj.GetServerTime();
     28       stopWatch.Stop();
     29       lsbIpc.Items.Add(stopWatch.ElapsedTicks);
     30     }
     31 
     32       //访问Web Service
     33     public void WebService()
     34     {
     35       Stopwatch stopWatch = new Stopwatch();
     36       stopWatch.Start();
     37       localhost.Service ws = new localhost.Service();
     38       ws.GetServerTime();
     39       stopWatch.Stop();
     40       lsbWeb.Items.Add(stopWatch.ElapsedTicks);
     41     }
     42     private void btnHttp_Click(object sender, EventArgs e)
     43     {
     44       Http();
     45     }
     46 
     47     private void btnTcp_Click(object sender, EventArgs e)
     48     {
     49       Tcp();
     50     }
     51 
     52     private void btnWebService_Click(object sender, EventArgs e)
     53     {
     54         WebService();
     55     }
     56 
     57     private void btnIpc_Click(object sender, EventArgs e)
     58     {
     59         Ipc();
     60     }
     61 
     62      //开始测试
     63     private void btnStat_Click(object sender, EventArgs e)
     64     {
     65       Int32 Times = int.Parse(txtTimes.Text);
     66       Int64 Sum = 0;
     67       double Ave=0;
     68       lsbHttp.Items.Clear();
     69       lsbIpc.Items.Clear();
     70       lsbTcp.Items.Clear();
     71       lsbWeb.Items.Clear();
     72 
     73       for (Int32 i = 0; i < Times; i++)
     74       {
     75         Http();
     76         Tcp();
     77         Ipc();
     78         WebService();
     79       }
     80        //计算平均时间
     81       for(Int32 i=0;i<Times;i++)
     82       {
     83         Sum += int.Parse(lsbHttp.Items[i].ToString ());
     84       }
     85       Ave = Sum / Times;
     86       txtHttp.Text = Ave.ToString();
     87 
     88       Sum = 0;
     89       for (Int32 i = 0; i < Times; i++)
     90       {
     91         Sum += int.Parse(lsbTcp.Items[i].ToString());
     92       }
     93       Ave = Sum / Times;
     94       txtTcp.Text = Ave.ToString();
     95 
     96       Sum = 0;
     97       for (Int32 i = 0; i < Times; i++)
     98       {
     99         Sum += int.Parse(lsbWeb.Items[i].ToString());
    100       }
    101       Ave = Sum / Times;
    102       txtWebService.Text = Ave.ToString();
    103 
    104       Sum = 0;
    105       for (Int32 i = 0; i < Times; i++)
    106       {
    107         Sum += int.Parse(lsbIpc.Items[i].ToString());
    108       }
    109       Ave = Sum / Times;
    110       txtIpc.Text = Ave.ToString();
    111     }
    112       HttpChannel httpChannel = new HttpChannel(9001);
    113       ChannelServices.RegisterChannel(httpChannel,false );
    114 
    115       TcpChannel tcpChannel = new TcpChannel(9002);
    116       ChannelServices.RegisterChannel(tcpChannel,false );
    117 
    118       IpcChannel ipcChannel = new IpcChannel("MyHost");
    119       ChannelServices.RegisterChannel(ipcChannel,false );
    120 
    121       RemotingConfiguration .RegisterWellKnownServiceType (typeof (RemoteObject .MyObject ),"MyObject",WellKnownObjectMode.SingleCall);
    122       Console.ReadLine();
  • 相关阅读:
    读书笔记——吴军《态度》
    JZYZOJ1237 教授的测试 dfs
    NOI1999 JZYZOJ1289 棋盘分割 dp 方差的数学结论
    [JZYZOJ 1288][洛谷 1005] NOIP2007 矩阵取数 dp 高精度
    POJ 3904 JZYZOJ 1202 Sky Code 莫比乌斯反演 组合数
    POJ2157 Check the difficulty of problems 概率DP
    HDU3853 LOOPS 期望DP 简单
    Codeforces 148D. Bag of mice 概率dp
    POJ3071 Football 概率DP 简单
    HDU4405 Aeroplane chess 飞行棋 期望dp 简单
  • 原文地址:https://www.cnblogs.com/linuxjava01/p/3732242.html
Copyright © 2011-2022 走看看