Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF比运行相同代码的WebAPI慢得多_C#_.net_Wcf_Asp.net Web Api - Fatal编程技术网

C# WCF比运行相同代码的WebAPI慢得多

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倍) 我应该注意到,所有数

我目前有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:
谢谢你的回答/评论。不幸的是,这个问题似乎没有得出任何结论。我和我的同事最终选择相信,这只是框架版本效率上的一个纯粹差异。我们最终对web服务进行了重组,使计算只在WebAPI中进行。

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

我的建议是,您会看到这样的差异,因为从.NET 3.5到.NET 4.6有很大的性能提升。如果大量使用框架元素,这可能是个问题

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


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

  • 您可以从这两个方面得到相同的结果,但是WebAPI设计用于HTTP(主要用于JSON),并且WCF需要更多配置才能成为HTTP(SOAP作为默认消息传递)
  • WCF支持多种传输协议,如消息队列、单向消息或双工、TCP、HTTP等
  • WCF可以这样配置:当上述其中一项可用且速度比其他项快时,它可以像TCP甚至UDP(在更高版本上)一样使用
  • 当然,这些通道中的每一个都需要配置,这有时会让人头疼
  • WebAPI设计用于HTTP,因此它支持请求/响应、标题、媒体格式(文本、JSON、jpeg、XML…、URI、缓存等)
  • SOAP处理和传输比JSON更重。时期这就是过去10年左右人们更喜欢JSON而不是XML的主要原因
  • 当您的服务可以暴露于广泛的客户机(主要是浏览器,但也包括手机)时,选择WebAPI
  • WebAPI是一个轻量级框架,适用于带宽有限的智能手机
  • 如前所述,客户端已经发展成为健壮的框架,如JQuery、Angular、Android等等。所有这些都需要从服务进行快速数据传输。目前,JSON是处理客户机和服务器之间数据的最简单、最快速的方法,WebAPI与之无缝配合

  • 因此,在编写代码之前,最好了解每个框架的最佳功能,并进行相应的选择。

    使用分析器

    无需任何匆忙,即可获得更好的数据。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