如何提高WCF数据服务性能

Sim*_*bee 24 wcf astoria wcf-data-services wcf-ria-services

我是WCF数据服务的新手,所以我一直在玩.经过一些初步测试后,我对测试数据服务的性能感到失望.

我意识到因为WCF DS是基于HTTP的,所以协议中固有的开销,但我的测试仍然比我预期的慢:

环境:

  • 所有在一个盒子:四核64位笔记本电脑与4GB RAM运行W7.体面的机器.
  • 具有16个表的小型SQL数据库(SQLExpress 2008 R2)...正在测试的表有243行.
  • 在IIS中托管我的测试服务,包含所有默认值.

码:

  • 我为这个数据库创建了一个实体框架模型(DataContext)(VS2010的股票代码).
  • 我已经基于这个模型创建了一个数据服务.
  • 我已经创建了一个客户端,该服务器具有针对此服务的直接服务引用(ObjectContext)(VS2010的股票代码)
  • 在客户端我也可以直接调用EF模型并使用Native SQL(ADO.NET SqlConnection)

测试计划:

  • 每次迭代都连接到数据库(有一个重用连接的选项),查询目标表中的所有行("EVENTS"),然后对它们进行计数(从而强制执行任何延迟的提取).
  • 为Native SQL(SqlConnection/SqlCommand),实体框架(DataContext)和WCF数据服务(ObjectContext)分别运行25次迭代.

结果:

  • Native SQL的25次迭代:436ms
  • 实体框架的25次迭代:656ms
  • WCF数据服务的25次迭代:12110ms

哎哟.这比EF慢约20倍.

由于WCF数据服务是HTTP,因此没有机会进行HTTP连接重用,因此每次迭代都会强制客户端重新连接到Web服务器.但肯定还有比这更多的事情.

EF本身相当快,并且同样的EF代码/模型被重用于服务和直接到EF客户端测试.对数据服务中的Xml序列化和反序列化会有一些开销,但那么多!?!我以前在Xml序列化方面表现很好.

我将使用JSON和协议缓冲区编码运行一些测试,以确定我是否可以获得更好的性能,但我很好奇社区是否有任何关于加快这一点的建议.

我对IIS不太满意,所以也许有一些IIS调整(缓存,连接池等)可以设置来改善这个?

ntz*_*lis 0

为了消除大部分连接开销,您可以尝试将所有操作批处理到 WCF DS,看看这是否会产生显着差异。

NorthwindEntities context = new NorthwindEntities(svcUri);
var batchRequests = 
     new DataServiceRequest[]{someCustomerQuery, someProductsQuery};

var batchResponse = context.ExecuteBatch(batchRequests);
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,请参见此处