This demonstrates the problem. Build and run the attached code with: mcs -t:library -out:thing.dll thing.cs mcs -r:thing.dll -r:System.Runtime.Remoting server.cs mcs -r:thing.dll -r:System.Runtime.Remoting client.cs xterm -e mono server.exe & time mono client.exe to time 200 calls. It takes ~16seconds realtime on my machine, but with only 0.467s user and 0.037s system time it's basically sitting there mostly doing nothing (top shows 99% idle)!
Tried it on a couple of machines with the same results. The code is essentially straight out of the OReilly "Programming C#" book. The mono system itself seems to be zippy enough: I can sum a billion ints in a couple of seconds. mono --profile on the client.exe shows most of the 16 seconds runtime is made up of 2800 calls at ~5.6ms each to System.Net.Sockets.Socket::Receive_internal
using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; public class Client { static void Main(string[] args) { ChannelServices.RegisterChannel(new TcpChannel()); MarshalByRefObject obj=(MarshalByRefObject)RemotingServices.Connect ( typeof(Thing), "tcp://localhost:8080/thing" ); Thing thing=obj as Thing; for (int i=0;i<200;i++) thing.Call(); } }
using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; public class Server { static void Main(string[] args) { ChannelServices.RegisterChannel(new TcpChannel(8080)); Thing thing = new Thing(); RemotingServices.Marshal(thing,"thing"); while(true) { Console.Write('.'); System.Threading.Thread.Sleep(1000); } } }
using System; public class Thing : MarshalByRefObject { public Thing() {Console.WriteLine("Thing created");} public void Call() {Console.Write('!');} }