Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Improve WCF Data Services Performance

Tags:

I'm new to WCF Data Services so I've been playing. After some initial tests I am disappointed by the performance of my test data service.

I realize that because a WCF DS is HTTP-based there is overhead inherent in the protocol but my tests are still way slower than I would expect:

Environment:

  • All on one box: Quad core 64-bit laptop with 4GB RAM running W7. Decent machine.
  • Small SQL database (SQLExpress 2008 R2) with 16 tables... the table under test has 243 rows.
  • Hosted my test service in IIS with all defaults.

Code:

  • I've created a Entity Framework model (DataContext) for this database (stock codegen by VS2010).
  • I've created a data-service based on this model.
  • I've created a client which has a direct service reference (ObjectContext) for this service (stock codegen by VS2010)
  • In the client I am also able to call the EF model directly and also use Native SQL (ADO.NET SqlConnection)

Test Plan:

  • Each iteration connects to the database (there is an option to reuse connections), queries for all rows in the target table ("EVENTS") and then counts them (thus forcing any deferred fetches to be performaed).
  • Run for 25 iterations each for Native SQL (SqlConnection/SqlCommand), Entity Framework (DataContext) and WCF Data Services (ObjectContext).

Results:

  • 25 iterations of Native SQL: 436ms
  • 25 iterations of Entity Framework: 656ms
  • 25 iterations of WCF Data Services: 12110ms

Ouch. That's about 20x slower than EF.

Since WCF Data Services is HTTP, there's no opportunity for HTTP connection reuse, so the client is forced to reconnect to the web server for each iteration. But surely there's more going on here than that.

EF itself is fairly fast and it's the same EF code/model is reused for both the service and the direct-to-EF client tests. There's going to be some overhead for Xml serialization and deserialization in the data-service, but that much!?! I've had good performance with Xml serialization in the past.

I'm going to run some tests with JSON and Protocol-Buffer encodings to see if I can get better performance, but I'm curious if the community has any advice for speeding this up.

I'm not strong with IIS, so perhaps there are some IIS tweaks (caches, connection pools, etc) that can be set to improves this?

like image 743
Simon Gillbee Avatar asked Oct 12 '10 16:10

Simon Gillbee


People also ask

Which of the following WCF binding gives best performance?

netTcpBinding. This binding sends SOAP 1.2 messages, provides binary encoding and optimized communication between WCF services and WCF clients on Windows network. This binding is the fastest binding amongst all WCF binding options between different nodes in the TCP network.

Is Grpc faster than WCF?

GRPC is better than WCF in terms of performance. You can refer to the following link, which compares WCF with GRPC.learn.microsoft.com/en-us/dotnet/architecture/…

What are 3 basic WCF configurations required for hosting a WCF service?

There are three types of hosting environments for WCF services: IIS, WAS, and self-hosting. The term “self-hosting” refers to any application that provides its own code to initialize the hosting environment. This includes console, Windows Forms, WPF, and managed Windows services.


1 Answers

Consider deploying as a windows service instead? IIS may have ASAPI filters, rewrite rules, etc that it runs through. even if none of these are active, the IIS pipeline is so long, something may slow you down marginally.

a service should give you a good baseline of how long it takes the request to run, be packed, etc, without the IIS slowdowns

like image 141
Jeremy Massel Avatar answered Oct 15 '22 19:10

Jeremy Massel