我目前有两个暴露的端点。第一个是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中进行计算。
答案 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之间进行选择的一个非常重要的区别:
因此,在编码之前,最好知道每个框架做得最好并相应地选择。