首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么JsonConvert比ASP.NET Core内置的Json格式化程序更快?

为什么JsonConvert比ASP.NET Core内置的Json格式化程序更快?
EN

Stack Overflow用户
提问于 2017-06-19 03:47:45
回答 2查看 1.1K关注 0票数 0

我了解到ASP.NET核心使用Newtonsoft.Json 9.0.1作为内置的JSON格式化程序(Microsoft.AspNetCore.JsonPatch)。然而,我仍然没有弄清楚是什么导致了这两种代码之间的性能差异:

使用内置JSON格式化程序(Newtonsoft.Json 9.0.1)

代码语言:javascript
复制
[Produces("application/json")]
[Route("api/BuiltIn")]
public class BuiltInController : Controller
{
    private static readonly BufferBlock<ParentModel> Block = new BufferBlock<ParentModel>();

    // GET: api/BuiltIn
    [HttpGet]
    public ParentModel Get()
    {
        if (!Block.TryReceive(out ParentModel model)) return null;
        return model;
    }

    // POST: api/BuiltIn
    [HttpPost]
    public bool Post([FromBody]ParentModel model)
    {
        if (model == null) return false;
        return Block.Post(model);
    }
}

结果(10k次请求): 后- 64分19秒,得- 57分8秒

使用JsonConvert (Newtonsoft.Json 9.0.1在AspNetCore中引用)

代码语言:javascript
复制
[Produces("application/json")]
[Route("api/JsonConvert")]
public class JsonConvertController : Controller
{
    private static readonly BufferBlock<ParentModel> Block = new BufferBlock<ParentModel>();

    // GET: api/JsonConvert
    [HttpGet]
    public ContentResult Get()
    {
        if (!Block.TryReceive(out ParentModel model)) return Content(null);
        return Content(JsonConvert.SerializeObject(model));
    }

    // POST: api/JsonConvert
    [HttpPost]
    public bool Post()
    {
        using (var reader = new StreamReader(Request.Body))
        {
            var request = reader.ReadToEnd();
            if (request == null) return false;
            var model = JsonConvert.DeserializeObject<ParentModel>(request);
            return Block.Post(model);
        }
    }
}

结果(10k次请求): 赛后- 63分47秒,得到- 56分18秒

无论我测试了多少个请求,直接使用JsonConvert都能提供更好的性能(大约1%)。造成这种表现差异的原因是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-19 06:01:24

除非你分析一下我们不能告诉你。

但是您应该忽略这个小的差别,这很可能是因为当您使用Content(...)Ok(...)助手方法时,您也总是实例化ContentResult和/或OkObjectResult (请参阅BaseController.cs源),并且在直接返回模型时可能会重用这些额外的GC。

代码语言:javascript
复制
[NonAction]
public virtual OkObjectResult Ok(object value)
{
    return new OkObjectResult(value);
}

而且,您的测试很可能是错误的,因为ASP.NET Core很有能力每秒执行200 k请求(请参阅TechEmpower基准,第14轮),或者您没有使用http管道,没有在不同的物理计算机上运行基准测试工具和ASP.NET应用程序等等。

更新

另外,请注意,使用public bool Post()的第二个测试不会调用模型绑定器,但是public bool Post([FromBody]ParentModel model)会调用。当您将模型作为参数时,ASP.NET核心必须调用IModelBinderFactory.CreateBinder (来源)来获得正确的模型绑定(即ComplexTypeModelBinder和其他取决于模型的外观,如ArrayModelBinderDictionaryModelBinderBodyModelBinder等)。

因此,您的测试所做的是有效地测试模型绑定和/或开销的性能。实例化ContentResult)的return Content(string)方法和,而不是,JSON.NET,直接与ASP.NET调用的JSON.NET。

票数 4
EN

Stack Overflow用户

发布于 2019-09-17 05:53:02

随着.NET核心3的发布,JSON序列化的性能将大大提高。

https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis/

这篇博客文章还包含了一些指标,概述了你可以期待的改进。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44621991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档