C# WCF比运行相同代码的WebAPI慢得多
我目前有2个公开的端点。第一个是WebAPI(.net4.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%确信两个客户的数据是相同的,并且他们都收到相同的结果 编辑:为清晰起见添加了图表(希望如此) 编辑2:C# WCF比运行相同代码的WebAPI慢得多,c#,.net,wcf,asp.net-web-api,C#,.net,Wcf,Asp.net Web Api,我目前有2个公开的端点。第一个是WebAPI(.net4.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倍) 我应该注意到,所有数
谢谢你的回答/评论。不幸的是,这个问题似乎没有得出任何结论。我和我的同事最终选择相信,这只是框架版本效率上的一个纯粹差异。我们最终对web服务进行了重组,使计算只在WebAPI中进行。我认为这是一些因素的组合。即REST(WebAPI)与SOAP(WCF)的性能,尤其取决于发送/接收的数据量。除了在ASP.NET中托管WCF服务这一事实之外,我认为在调用该服务之前,该服务实际上不会运行或初始化,因此您将有一些初始化时间。我的建议是,您会看到这样的差异,因为从.NET 3.5到.NET 4.6有很大的性能提升。如果大量使用框架元素,这可能是个问题 检查下面的链接(它们包含有关性能提升的信息):
因此,在编写代码之前,最好了解每个框架的最佳功能,并进行相应的选择。使用分析器 无需任何匆忙,即可获得更好的数据。CPU使用率和内存、GC集合、热路径等的配置文件 也就是说 您正在比较两个截然不同的.NET版本。这使得不可能制定一个公平的基准 .NET4.6为64位引入了一种新的JIT,速度明显更快。这只是一个区别。太多了,无法列出 如果您无法更改.NET版本,您将永远无法获得准确的基准,但可以查找可疑对象。我绝对会使用分析器,但如果进行基准测试: 查看生成的
IL
(预JIT)并确保对后JIT(IL->机器代码)进行基准测试
一种简单的方法是在开始实际的基准测试之前,将两个基准测试作为“冷启动”运行一次(不进行测量)
另一种方法是在JIT方法的基准测试之前使用RuntimeHelpers.PrepareMethod
,这样就不用测量JIT时间了
当然,要确保你的基准是公平的
有很多信息,但请确保您使用的是高分辨率计时器,使用大样本量(重复多次),在每次测量之前执行GC.Collect()
,使用相同的硬件(在同一个盒子上测试),等等
在过程中正确地进行基准测试(与评测相反)实际上是不正确的
看起来很简单
其他一切都只是我们的猜测。除非你发布真实的代码来重现你的行为,否则我无法发表评论。衡量的性能不包括网络时间。所以我不认为这可能是REST/SOAP问题。至于初始化时间,这是可能的,但我只在一个实例中看到这种速度减慢,而在其他共享ca中看不到
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