WCF比运行相同代码的

时间:2017-10-16 21:40:02

标签: c# .net wcf asp.net-web-api

我目前有两个暴露的端点。第一个是WebAPI(.NET 4.6)。第二个是WCF(.NET 3.5)。它们都能够执行相同的计算,但是WCF平均慢10倍。有问题的计算代码包含在dll中,我们称之为core.dll。此dll还公开WCF端点,并由ASP.NET站点使用。 webapi dll,我们称之为api.dll引用core.dll,并由SPA使用。计算可以由任一客户端触发。平均而言,使用我的测试数据,WCF服务大约需要4.5秒来执行计算,其中WebAPI大约需要450毫秒(或大约快10倍)。

我应该注意,所有数据库调用都是在测量的时间范围之外完成的。事先检索所有数据,并在计算完成后进行所有更新。

在所有条件相同的情况下,我有什么理由可以看到纯处理速度的巨大差异?

我100%确定两个客户的数据是相同的,并且它们都会收到相同的结果。

WEBAPI Controller
    Service
        GRAB DATA
        start timer
        Process(DATA) -- the same code/class as below
        end timer
        UPDATE DATA
    Service return
WEBAPI Controller return

WCF Endpoint
    Service
        GRAB DATA
        start timer
        Process(DATA) -- the same code/class as above
        end timer
        UPDATE DATA
    Service return
WCF Endpoint return

编辑:为清晰起见添加图表(希望如此)

编辑2: 谢谢你的回答/评论。不幸的是,这个问题似乎没有任何结论。我和我的同事最终选择相信这只是Framework版本效率的纯粹差异。我们最终重组了Web服务,以便只在WebAPI中进行计算。

4 个答案:

答案 0 :(得分:4)

使用分析器

在没有任何麻烦的情况下获得更好的数据。分析CPU使用率和内存,GC集合,热路径等......

那说......

您正在比较两个截然不同的.NET版本。这使得无法做出公平的基准。

.NET 4.6为64位引入了一个新的JIT,速度要快得多。这只是一个区别。列出太多了。

如果您无法更改.NET版本,您将从不获得准确的基准,但可以查找嫌疑人。我绝对会使用分析器,但如果基准测试:

查看生成的IL(pre-JIT)并确保您对JIT后的基准(IL - >机器代码)。

一种简单的方法是在开始实际基准测试之前,将两个基准测试(不测量)作为“冷启动”运行。

另一种方法是在JIT方法的基准测试之前使用RuntimeHelpers.PrepareMethod,这样你就不会测量JIT时间。

当然,确保您的基准是公平的。

有很多信息,但确保你使用高分辨率计时器,使用大样本量(重复多次),在每次测量前做一个GC.Collect(),使用相同的硬件(在同一个硬件上进行测试)盒子)等...

正确地在进程中进行基准测试(而不是分析)实际上不是 看起来很简单。

其他任何事情都只是我们的猜测。除非你发布了能重现你行为的真实代码,否则我无法发表评论。

答案 1 :(得分:3)

我的呼吁是你看到了这样的差异,因为从.net 3.5到.net 4.6有很大的性能提升。如果你大量使用可能成为问题的框架元素。

检查下面的链接(它们包含有关性能提升的信息):

答案 2 :(得分:2)

我认为这是一些事情的组合。即REST(WebAPI)与SOAP(WCF)的性能,尤其取决于发送/接收的数据量。除了在ASP.NET中托管WCF服务这一事实之外,我不认为服务实际上正在运行或初始化,直到它被调用,因此您将有一些初始化时间。

答案 3 :(得分:1)

除了此处其他答案中提到的性能改进之外,我想指出在WCF和Web API之间进行选择的一个非常重要的区别:

  1. 您可以从两者中获得相同的内容,但 WebAPI 旨在使用HTTP(主要使用 JSON )和 WCF 需要更多配置为HTTP( SOAP 作为默认消息传递)。
  2. WCF 支持多种传输协议,例如消息队列,单向消息传递或双工,TCP,HTTP等等。
  3. WCF 可以配置为当上述其中一个可用且比其他更快时,它可以像TCP甚至UDP一样使用(在更高版本中)...
  4. 当然,这些渠道中的每一个都需要配置,这有时会让人感到痛苦。
  5. WebAPI 旨在使用 HTTP ,因此它支持请求/响应,标头,媒体格式(文本, JSON , jpeg,XML ...),URI,缓存等。
  6. SOAP 处理和传输比 JSON “更重”。期。这是过去10年左右更喜欢使用JSON而不是XML的主要原因。
  7. 当您的服务可以向大量客户端(主要是浏览器)以及移动设备公开时,选择Web API!
  8. WebAPI是一种轻量级框架,适用于带宽有限的智能手机。
  9. 如上所述,客户已经发展成为强大的框架,例如 JQuery,Angular,Android 等等。所有这些都需要从服务中快速传输数据。目前, JSON 是在客户端和服务器之间处理数据的最简单,最快捷的方式, WebAPI 正在与之无缝协作。
  10. 因此,在编码之前,最好知道每个框架做得最好并相应地选择。