Q:

WCF Service Slow To Pass Objects. Is That Normal?

I've got a WPF application written in C#.  It has to instantiate thousands of objects.  After pulling data from the database server,  it has to run a ton of calculations that takes time.  The whole process takes up to 20-30 seconds with 80% of it coming from the calculations.
So to help resolve this issue, I wrote a WCF service that keeps a copy of the already instantiated objects with the calcs already run, and then upon request, transfers the instantiated objects to the calling client.
It works!  However it's slow...really slow.  Much slower than the original way.  It takes 3-4 minutes to transfer all the objects from the WCF service, thus defeating it's purpose.  
I've tried streaming instead of buffering the service and increasing or decreasing the different service options in the client and server config files, but haven't found settings that make a real difference yet.
Is this slow speed to be expected, or should it be fast and I just need to modify some options?  If so, what options?

A:

WCF isn't necessarily slow but if the application isn't designed properly, the application can be slow. It could be compared to loading up a few thousand pounds of weight on a sports car. The car is a fast car, but it isn't really being used properly. 
First, I would say you have to minimize the amount of data that is being sent on the wire (more about this later). Once on the wire, you'll get a lot better performance if you use TCP or named pipes instead of HTTP. See Choosing a Transport. HTTP is easy since most networks are configured to let is past easily but it isn't designed for large data sets.
If the delay is coming from the calculations, then the only thing the WCF service will accomplish is offloading the processing from the server to the client. Ultimately this might be a good thing - or even necessary - if you plan on having a high volume of concurrent requests to the server but as you have noticed, it doesn't necessarily mean shorter times for the end user. What you should focus on doing is minimizing the calculation time.
It is hard to give specifics since you havent revealed much about what is being queried, what is being returned and the the calculations are doing. However, I have had impressive results with large data sets by offloading code from the application server to the database server via Visual Studio SQL Server Projects. Since .NET and MSSQL are both written on the CLR, you can write native database objects (like user defined functions) in C# or VB or any other CLR language and deploy them directly into the database. Then you can use these functions in your queries and they are very fast since they are compiled into native SQL. I've seen orders of magnitude in difference between running C# in the application vs running the same function in the database. 

