亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JSON.NET ANY ContractResolver 導致性能不佳

JSON.NET ANY ContractResolver 導致性能不佳

C#
慕森王 2021-11-07 19:21:43
在對非常高吞吐量的應用程序進行性能測試期間,我們發現 JSON.NET 的ContractResolver. 不幸的是,當您指定一個時ContractResolver,性能似乎變得難以忍受,包括DefaultContractResolver尋求其他專家的建議,以獲取有關如何獲得性能而不鎖定 CPU 并占用不合理時間的任何建議?,F在,由于這個問題,我們看到性能下降了 87%(有任何ContractResolver定義的每秒 80 個請求,沒有ContractResolver 定義的每秒 600 個請求。測試運行的輸出是:默認解析器: Time elapsed 3736 millisecondsNoOp 解析器: Time elapsed 4150 milliseconds無解析器: Time elapsed 8 milliseconds蛇盒: Time elapsed 4753 milliseconds第三方(SnakeCase.JsonNet): Time elapsed 3881 milliseconds
查看完整描述

1 回答

?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

看起來好像ContractResolver需要反射,并且如果堅持下去就會緩存對象類型。將 存儲ContractResolver在全局范圍內會大大改變時間:


默認解析器: Time elapsed 10 milliseconds


NoOp 解析器: Time elapsed 7 milliseconds


無解析器: Time elapsed 7 milliseconds


蛇盒: Time elapsed 178 milliseconds


第三方(SnakeCase.JsonNet): Time elapsed 10 milliseconds


更新測試代碼:


using System;

using System.Collections.Generic;

using System.Diagnostics;

using Microsoft.VisualStudio.TestTools.UnitTesting;

using Newtonsoft.Json;

using Newtonsoft.Json.Serialization;

using SnakeCase.JsonNet;


namespace Anonymous.Public.Namespace

{

    public class Person

    {

        public string Name { get; set; }

        public DateTime DateOfBirth { get; set; }

        public bool EatsMeat { get; set; }

        public decimal YearlyHouseholdIncome { get; set; }


        public List<Car> CarList { get; set; }

    }


    public class Car

    {

        public string Make { get; set; }

        public string Model { get; set; }

        public int Year { get; set; }

    }

    public class NoOpNamingStrategy : NamingStrategy

    {

        public NoOpNamingStrategy(bool processDictionaryKeys, bool overrideSpecifiedNames)

        {

            base.ProcessDictionaryKeys = processDictionaryKeys;

            base.OverrideSpecifiedNames = overrideSpecifiedNames;

        }


        public NoOpNamingStrategy(bool processDictionaryKeys, bool overrideSpecifiedNames, bool processExtensionDataNames) : this(processDictionaryKeys, overrideSpecifiedNames)

        {

            base.ProcessExtensionDataNames = processExtensionDataNames;

        }


        public NoOpNamingStrategy()

        {

        }


        protected override string ResolvePropertyName(string name)

        {

            return name;

        }

    }


    [TestClass]

    public class SerializationTest

    {

        public static Person p { get; set; } = new Person

        {

            Name = "Foo Bar",

            DateOfBirth = new DateTime(1970, 01, 01),

            EatsMeat = true,

            YearlyHouseholdIncome = 47333M,

            CarList = new List<Car>

            {

                new Car

                {

                    Make = "Honda",

                    Model = "Civic",

                    Year = 2019

                }

            }

        };


        public static IContractResolver Default { get; set; } = new DefaultContractResolver();


        public static IContractResolver NoOp { get; set; } = new DefaultContractResolver

        {

            NamingStrategy = new NoOpNamingStrategy()

        };


        public static IContractResolver SnakeCase { get; set; } = new DefaultContractResolver

        {

            NamingStrategy = new SnakeCaseNamingStrategy()

        };


        public static IContractResolver ThirdParty { get; set; } = new SnakeCaseContractResolver();


        public const int ITERATIONS = 1000;


        [TestMethod]

        public void TestSnakeCase()

        {

            var sw = new Stopwatch();

            sw.Start();

            for (var i = 0; i < ITERATIONS; i++)

            {

                var str = JsonConvert.SerializeObject(p, new JsonSerializerSettings

                {

                    ContractResolver = SnakeCase

                });

            }


            sw.Stop();

            var elapsed = sw.ElapsedMilliseconds;

            Debug.WriteLine($"Time elapsed {elapsed} milliseconds");

        }


        [TestMethod]

        public void TestNoResolver()

        {

            var sw = new Stopwatch();

            sw.Start();

            for (var i = 0; i < ITERATIONS; i++)

            {

                var str = JsonConvert.SerializeObject(p);

            }


            sw.Stop();

            var elapsed = sw.ElapsedMilliseconds;

            Debug.WriteLine($"Time elapsed {elapsed} milliseconds");

        }


        [TestMethod]

        public void TestDefaultResolver()

        {

            var sw = new Stopwatch();

            sw.Start();

            for (var i = 0; i < ITERATIONS; i++)

            {

                var str = JsonConvert.SerializeObject(p, new JsonSerializerSettings

                {

                    ContractResolver = Default

                });

            }


            sw.Stop();

            var elapsed = sw.ElapsedMilliseconds;

            Debug.WriteLine($"Time elapsed {elapsed} milliseconds");

        }


        [TestMethod]

        public void TestThirdPartySnakeResolver()

        {

            var sw = new Stopwatch();

            sw.Start();

            for (var i = 0; i < ITERATIONS; i++)

            {

                var str = JsonConvert.SerializeObject(p, new JsonSerializerSettings

                {

                    ContractResolver = ThirdParty

                });

            }


            sw.Stop();

            var elapsed = sw.ElapsedMilliseconds;

            Debug.WriteLine($"Time elapsed {elapsed} milliseconds");

        }


        [TestMethod]

        public void TestNoOpResolver()

        {

            var sw = new Stopwatch();

            sw.Start();

            for (var i = 0; i < ITERATIONS; i++)

            {

                var str = JsonConvert.SerializeObject(p, new JsonSerializerSettings

                {

                    ContractResolver = NoOp

                });

            }


            sw.Stop();

            var elapsed = sw.ElapsedMilliseconds;

            Debug.WriteLine($"Time elapsed {elapsed} milliseconds");

        }

    }

}


查看完整回答
反對 回復 2021-11-07
  • 1 回答
  • 0 關注
  • 220 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號