我是 WCF 数据服务的新手,所以我一直在玩。经过一些初步测试后,我对测试数据服务的性能感到失望。
我意识到,因为 WCF DS 是基于 HTTP 的,所以协议中存在固有的开销,但我的测试仍然比我预期的要慢:
环境:
- 一体机:四核 64 位笔记本电脑,配备 4GB RAM,运行 W7。体面的机器。
- 具有 16 个表的小型 SQL 数据库(SQLExpress 2008 R2)……被测表有 243 行。
- 在 IIS 中使用所有默认值托管我的测试服务。
代码:
- 我已经为这个数据库(VS2010 的股票代码生成)创建了一个实体框架模型(DataContext)。
- 我基于这个模型创建了一个数据服务。
- 我创建了一个客户端,该客户端具有此服务的直接服务引用(ObjectContext)(VS2010 的股票代码生成)
- 在客户端中,我还可以直接调用 EF 模型并使用 Native SQL (ADO.NET SqlConnection)
测试计划:
- 每次迭代都连接到数据库(有一个重用连接的选项),查询目标表中的所有行(“EVENTS”),然后对它们进行计数(从而强制执行任何延迟提取)。
- 对 Native SQL (SqlConnection/SqlCommand)、实体框架 (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 调整(缓存、连接池等)来改善这一点?