[Mono-list] Why is MONO network streaming slow?

Andreas Hund ahund at ionosinst.de
Thu Jun 14 08:42:42 EDT 2007


Hi,  
is MONO network streaming slow? 
 
First I built a very simple client/server program  
to get a data stream over network. 
In both programs I used a TcpClient, 
a NetworkStream and a byte array (8kB chunks) 
to stream 20 MB of data. 
 
Then I tested the transfer rate of the client/server 
program between different Linux/MONO (1.2.3.1)  
and different Windows/.NET (2.0) hosts 
in a 100 Mbit/s ethernet. 
 
The strange result: If MONO was involved  
the speed was dramatically reduced. 
Only a .NET/.NET transfer showed a realistic 
rate.   
 
.NET --> MONO : 31...42 Mbit/s   LOW 
MONO --> MONO : 43...45 Mbit/s   LOW 
MONO --> .NET : 51...76 Mbit/s   LOW 
.NET --> .NET : 94 Mbit/s   O.K. 
 
What's wrong here? 
Any suggestions or hints? 
Thanks in advance. 
 
Cheers  
Andreas 
 
 
======================================================= 
 
 
Sourcecodes: 
 
// ****** 
// Client 
// ****** 
 
using System; 
using System.IO; 
using System.Net.Sockets; 
 
namespace SimpleStreamClient 
{ 
  class SimpleStreamClient 
  { 
    public static void Main(string[] args) { 
      TcpClient client; 
      NetworkStream netStream; 
      byte[] buf = new byte[8192]; 
      int bytesToReceive = buf.Length; 
      int receivedBytes = 0; 
      int bytesReceived = 0; 
 
      for(int index = 0; index < 10; index++) { 
        client = new TcpClient(args[0], 14866); 
        netStream = client.GetStream(); 
        DateTime startTime = DateTime.Now; 
        bytesReceived = 0; 
    
        while(true) { 
          bytesToReceive = buf.Length; 
      
          while(bytesToReceive > 0) { 
            receivedBytes = netStream.Read(buf, 0, bytesToReceive); 
            if(receivedBytes == 0) { 
            break; 
          } 
          bytesReceived += receivedBytes; 
          bytesToReceive -= receivedBytes; 
        } 
        if(receivedBytes == 0) { 
          break; 
        } 
     } 
     double rate = bytesReceived / (((TimeSpan)(DateTime.Now -
startTime)).TotalMilliseconds * 1000) * 8; 
     Console.WriteLine(bytesReceived + " Bytes received (" + rate +
"MBit/s)."); 
   } 
   Console.ReadKey(); 
  } 
 } 
} 
 
 
// ****** 
// Server 
// ****** 
 
using System; 
using System.IO; 
using System.Net; 
using System.Net.Sockets; 
 
namespace SimpleStreamServer 
{ 
  class SimpleStreamServer 
  { 
    public static void Main(string[] args) { 
      TcpClient client; 
      NetworkStream netStream; 
      byte[] bigBuf = new byte[20000000]; 
      MemoryStream ms = new MemoryStream(bigBuf); 
      byte[] buf = new byte[8192]; 
      string host = Dns.GetHostEntry(args[0]).AddressList[0].ToString(); 
      IPAddress ipAddr = IPAddress.Parse(host); 
      TcpListener listener = new TcpListener(ipAddr, 14866); 
      listener.Start(); 
  
      while(true) { 
        Console.WriteLine("Waiting for client ..."); 
        client = listener.AcceptTcpClient();    
        Console.WriteLine("New client!");    
        netStream = client.GetStream(); 
        ms.Seek(0, SeekOrigin.Begin); 
        int readBytes = 0; 
        while((readBytes = ms.Read(buf, 0, buf.Length)) != 0) { 
          netStream.Write(buf, 0, readBytes); 
        } 
        netStream.Flush(); 
        client.Close(); 
      } 
    } 
  } 
} 

-- 
View this message in context: http://www.nabble.com/Why-is-MONO-network-streaming-slow--tf3921539.html#a11119438
Sent from the Mono - General mailing list archive at Nabble.com.



More information about the Mono-list mailing list