WCF服务慢 - 选项?

时间:2013-07-12 19:52:51

标签: json performance wcf serialization json.net

我有一个返回JSON数据的WCF服务。它必须能够返回10000-50000个对象。我已经做了一些时间,并且服务调用完成的方法的主体需要不到10毫秒,但是客户端会经历5秒或更长的延迟来获得响应。出于开发目的,客户端和服务器都在同一台机器上,因此网络延迟不是一个因素。

我的感觉是将CLR对象序列化为JSON是一直在进行的。我已经考虑过GZiping的响应,但我认为这可能会让它变慢,因为网络带宽不是问题。我也考虑过使用JSON.NET而不是内置的序列化,但是我还没有找到关于如何做到这一点的最新端到端信息,所以我无法让它工作,而且我我不确定它可能提供多快的速度。

还有什么我需要研究的,以加快速度吗?

2 个答案:

答案 0 :(得分:2)

使用开关值All启用跟踪。它应该揭示有用的东西。

<system.diagnostics>
 <sources>
  <source name="System.ServiceModel" switchValue="All" >
    <listeners>
      <add name="xml"
         type="System.Diagnostics.XmlWriterTraceListener"
         initializeData="C:\UserTraces.svclog" />
    </listeners>
  </source>
 </sources>
 <trace autoflush="true" />
</system.diagnostics>

答案 1 :(得分:0)

我建议看一下描述为vibhu的描述,我不会太快将网络带宽排除在可能的瓶颈之外。根据我的经验,特别是对于大型消息,序列化开销和网络传输占整个操作响应时间的很大一部分。使用不同的绑定 - 例如命名管道。尝试在进程中调用服务。尝试将其中一条消息序列化到磁盘并将其反序列化回内存并在其周围包裹秒表计时器。这些是用于了解序列化成本的穷人工具。 [dotTrace]是一个高质量的商业分析器,可以告诉你很多时间花在哪里。

最后,在我们的测试中,GZip会提高您的CPU使用率,但会对响应时间产生微不足道的影响,以换取明显更小的网络传输。最后它对我们来说明显更快,我会推荐给任何不受CPU限制的人。但是,如果您的问题是序列化成本而不是网络传输,那么这很可能无法解决您的直接问题。话虽如此,如果您的CPU有备用时间,那么通用可扩展性可能只是一个好主意。

希望有帮助...