.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信道),你們能夠本身測試一下,或研究一個比較好的方法。網絡

 

相關代碼:tcp

  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();
相關文章
相關標籤/搜索