2012년 7월 26일 목요일 오후 2:45
I'm trying to get my head around remoting and MarshalByRefObject in .NET. Whereas I think I have a reasonable understanding how this works using more "standard" WCF (TcpChannel, etc.), I don't really understand remoting. I have a situation in which I need to make an informed choice between running an object in a separate application domain versus running in the same application domain. I won't go into all the details, but we would prefer to run in a separate application domain. However, we're finding it to be considerably slower, so I'd like to understand better what's going on and/or to get tips on how to speed it up.
I have a very simple server that looks like this:
IpcChannel serverChannel = new IpcChannel(CHANNEL_PORT); ChannelServices.RegisterChannel(serverChannel, false); RemotingConfiguration.RegisterWellKnownServiceType(typeof(ProjectInfo), "ProjectInfo.rem", WellKnownObjectMode.Singleton);
My "ProjectInfo" class inherits from "MarshalByRefObject". It has a method that returns a very large dataset (> 50MB) in a two-dimensional array (e.g. double[,] GetData()). If I run the object in the same application domain, it takes in the neighborhood of 2.5 seconds. If I run in a different application domain using the above server, it takes on average about 12.5 seconds.
So here are my questions:
- How can I make this faster?
- What's really going on across the application domain boundary? Is the dataset being serialized/deserialized? If so, can this be controlled/tweaked? Is it just the marshalling, security checking, etc. that's taking so long?
Any help with this would be much appreciated!
P.S. Yes, this question was previously posted in the WCF forum, but I was advised to post it here instead.