【发布时间】:2011-04-24 10:30:21
【问题描述】:
我是 WCF 数据服务的新手,所以我一直在玩。经过一些初步测试后,我对测试数据服务的性能感到失望。
我意识到,由于 WCF DS 是基于 HTTP 的,因此协议中存在固有的开销,但我的测试仍然比我预期的要慢:
环境:
- 一体机:四核 64 位笔记本电脑,配备 4GB RAM,运行 W7。不错的机器。
- 具有 16 个表的小型 SQL 数据库 (SQLExpress 2008 R2)...被测表有 243 行。
- 在 IIS 中使用所有默认值托管我的测试服务。
代码:
- 我已经为这个数据库(VS2010 的 stock codegen)创建了一个实体框架模型 (DataContext)。
- 我已经基于这个模型创建了一个数据服务。
- 我创建了一个客户端,该客户端具有此服务的直接服务引用 (ObjectContext)(VS2010 的股票代码生成)
- 在客户端我也可以直接调用 EF 模型,也可以使用 Native SQL (ADO.NET SqlConnection)
测试计划:
- 每次迭代都连接到数据库(可以选择重用连接),查询目标表中的所有行(“EVENTS”),然后对它们进行计数(从而强制执行任何延迟提取)。
- 为 Native SQL (SqlConnection/SqlCommand)、实体框架 (DataContext) 和 WCF 数据服务 (ObjectContext) 分别运行 25 次迭代。
结果:
- 25 次 Native SQL 迭代:436ms
- 25 次实体框架迭代:656 毫秒
- 25 次 WCF 数据服务迭代:12110 毫秒
哎哟。这比 EF 慢了大约 20 倍。
由于 WCF 数据服务是 HTTP,因此没有机会重用 HTTP 连接,因此每次迭代都强制客户端重新连接到 Web 服务器。但肯定不止于此。
EF 本身相当快,并且相同的 EF 代码/模型被重复用于服务和直接到 EF 的客户端测试。数据服务中的 Xml 序列化和反序列化会产生一些开销,但是那么多!?!过去我在 Xml 序列化方面取得了不错的成绩。
我将使用 JSON 和 Protocol-Buffer 编码运行一些测试,看看我是否可以获得更好的性能,但我很好奇社区是否有任何加快速度的建议。
我不擅长 IIS,所以也许可以设置一些 IIS 调整(缓存、连接池等)来改善这一点?
【问题讨论】:
-
有趣...一些观点、一些赞成票和一些最喜欢的添加,但没有答案。我正在为此提供赏金,以便为这个问题注入更多活力。希望有人能给出答案。
-
除非我打算将我的数据公开给其他应用程序,否则我不会使用 WCF 数据服务。如果一切都在同一个盒子上运行,为什么不直接使用 EF?
-
它不在同一个盒子上运行。但是数据源都在一个(非常大和国际化的)公司网络上。我试图在一堆不同的数据源(SQL、XML、平面文件等)前面放置一个服务层,将实际存储语义与发现和查询数据的能力隔离开来。
-
你是如何测试这个的。我曾经用 IE 测试过一个 web 服务。显示数据的浏览器开销是 80% 左右。
-
你在这个测试中使用了多少数据,可能是吞吐量。
标签: wcf wcf-ria-services wcf-data-services astoria