我目前有2个暴露的端点。第一个是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中进行计算。
使用分析器。
在没有任何麻烦的情况下,获得更好的数据。分析CPU使用率和内存,GC集合,热路径等...
那说......
您正在比较两个截然不同的.NET版本。这使得无法做出公平的基准。
.NET 4.6为64位引入了一个新的JIT,速度要快得多。这只是一个区别。列表太多了。
如果你不能改变.NET版本 决不 获得准确的基准,但可以寻找嫌疑人。我绝对会使用分析器,但如果基准测试:
看看生成的 IL
(预JIT)并确保您对JIT后的基准(IL - >机器代码)。
一种简单的方法是在开始实际基准测试之前简单地将两个基准测试(未测量)作为“冷启动”运行。
另一种是使用 RuntimeHelpers.PrepareMethod
在JIT方法的基准之前,所以你不是在测量JIT时间。
当然,确保您的基准是公平的。
有很多信息,但确保你使用高分辨率计时器,使用大样本(重复多次),做一个 GC.Collect()
在每次测量之前,使用相同的硬件(在同一个盒子上测试)等...
正确地进行过程中的基准测试(而不是剖析) 不
看起来很简单。
其他任何事情都只是我们的猜测。除非你发布了能重现你行为的真实代码,否则我无法发表评论。
我的呼吁是你看到了这样的差异,因为从.net 3.5到.net 4.6有很大的性能提升。如果你大量使用可能成为问题的框架元素。
检查下面的链接(它们包含有关性能提升的信息):
我认为这是一些事情的组合。即REST(WebAPI)与SOAP(WCF)的性能,尤其取决于发送/接收的数据量。除了在ASP.NET中托管WCF服务这一事实之外,我认为服务实际上不会在调用之前运行或初始化,因此您将有一些初始化时间。
除了这里的其他答案中提到的性能改进之外,我想指出在WCF和Web API之间进行选择的一个非常重要的区别:
- 你可以从他们两个得到相同,但是 的WebAPI 旨在使用HTTP(主要用于 JSON)和 WCF 需要更多配置为HTTP(肥皂 作为默认消息)。
- WCF 支持多种传输协议,如消息队列,单向消息传递或双工,TCP,HTTP等等。
- WCF 可以这样配置,当上面的一个可用并且比其他的更快时,它可以像TCP甚至UDP一样使用(在更高版本中)......
- 当然,这些渠道中的每一个都需要配置,这有时可能是一个痛苦的问题。
- 该 的WebAPI 旨在与。一起工作 HTTP,所以它支持请求/响应,标题,媒体格式(文本, JSON,jpeg,XML ...),URI,缓存等。
- 肥皂 处理和运输比“重” JSON。期。这是过去10年左右更喜欢JSON而不是XML的主要原因。
- 通过选择Web API,您的服务可以暴露给广泛的客户端,主要是浏览器,还有手机!
- WebAPI是一种轻量级框架,适用于带宽有限的智能手机。
- 如前所述,客户已经发展成为强大的框架,例如 JQuery,Angular,Android 和更多。所有这些都需要从服务中快速传输数据。目前, JSON 是在客户端和服务器之间处理数据的最简单,最快捷的方式 的WebAPI 与它无缝合作。
因此,在编码之前,最好知道每个框架做得最好并相应地选择。