wcf - 如何提高 WCF 数据服务性能

标签 wcf wcf-ria-services wcf-data-services astoria

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

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

环境:

  • 一体机:四核 64 位笔记本电脑,配备 4GB RAM,运行 W7。体面的机器。
  • 具有 16 个表的小型 SQL 数据库(SQLExpress 2008 R2)……被测表有 243 行。
  • 在 IIS 中使用所有默认值托管我的测试服务。

  • 代码:
  • 我已经为这个数据库(VS2010 的股票代码生成)创建了一个 Entity Framework 模型(DataContext)。
  • 我基于这个模型创建了一个数据服务。
  • 我创建了一个客户端,该客户端具有此服务的直接服务引用 (ObjectContext)(VS2010 的股票代码生成)
  • 在客户端中,我还可以直接调用 EF 模型并使用 Native SQL (ADO.NET SqlConnection)

  • 测试计划:
  • 每次迭代都连接到数据库(有一个重用连接的选项),查询目标表中的所有行(“事件”),然后对它们进行计数(从而强制执行任何延迟提取)。
  • 为 Native SQL (SqlConnection/SqlCommand)、 Entity Framework (DataContext) 和 WCF 数据服务 (ObjectContext) 运行 25 次迭代。

  • 结果:
  • Native SQL 25 次迭代:436ms
  • Entity Framework 25 次迭代:656ms
  • WCF 数据服务 25 次迭代:12110ms

  • 哎哟。这比 EF 慢了大约 20 倍。

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

    EF 本身相当快,并且服务和直接到 EF 客户端测试都重用了相同的 EF 代码/模型。数据服务中的 Xml 序列化和反序列化会产生一些开销,但是那么多!?!过去,我在 Xml 序列化方面取得了不错的成绩。

    我将使用 JSON 和 Protocol-Buffer 编码运行一些测试,看看我是否可以获得更好的性能,但我很好奇社区是否有任何加快速度的建议。

    我不擅长 IIS,所以也许可以设置一些 IIS 调整(缓存、连接池等)来改善这一点?

    最佳答案

    考虑改为部署为 Windows 服务? IIS 可能有它运行的 ASAPI 过滤器、重写规则等。即使这些都不是事件的,IIS 管道也很长,有些东西可能会稍微减慢你的速度。

    服务应该为您提供一个很好的基线,即请求运行、打包等需要多长时间,而不会降低 IIS 速度

    关于wcf - 如何提高 WCF 数据服务性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3916983/

    相关文章:

    linq-to-entities - 如何在 .NET Ria 服务中查询 Linq to Entity 框架中的关联

    odata - WEB API ODATA 错误 "No HTTP resource was found that matches the request"

    wcf - httpWebRequest-获取错误内容

    WCF ChannelFactory 没有准确报告故障状态?

    c# - 从 WCF 服务查看 HTTP header

    c# - 正确处理 DomainOperationException

    google-chrome-devtools - 更新到版本 32.0.1700.76 m 后,Chrome 不显示 Silverlight RIA 服务消息的网络流量

    c# - 用于 silverlight 4 + WCF 数据服务的 IAsyncRepository 或 IObservableRepository

    c# - 如何禁用服务器上的 DNS 身份检查