为什么 C# 中的类型化 JSON 解析比 Node.js JSON.parse 慢很多?

问题描述 投票:0回答:1

我的字符串中有一个简单的 JSON 对象,我正在比较 C# (.NET core) 和 Node.js 之间解析(反序列化)该对象所用的时间

Node.js 测试:

const { performance } = require('perf_hooks');

const data = '{"_id":"5ff0fa604a1956d24e936b15","index":0,"guid":"de606748-9b6f-473c-bef4-efce5cd2914d","isActive":true,"balance":"$1,475.89","picture":"http://placehold.it/32x32","age":33,"eyeColor":"green","name":"Clara Mcmahon","gender":"female","company":"QUILM","email":"[email protected]","phone":"+1 (871) 509-3806","address":"391 Schroeders Avenue, Ironton, Hawaii, 1368","about":"Commodo aliqua Lorem adipisicing esse in deserunt incididunt quis. Commodo sint amet quis adipisicing exercitation non Lorem aliquip tempor velit incididunt laboris. Ullamco in id anim commodo incididunt sint ad amet.\\r\\n","registered":"2014-05-23T05:47:53 -02:00","latitude":78.629772,"longitude":10.274508}';
let t0 = performance.now()
let parsed = JSON.parse(data); // measuring this part
let t1 = performance.now()
console.log(t1-t0);

C# 测试:

string data = "{\"_id\":\"5ff0fa604a1956d24e936b15\",\"index\":0,\"guid\":\"de606748-9b6f-473c-bef4-efce5cd2914d\",\"isActive\":true,\"balance\":\"$1,475.89\",\"picture\":\"http://placehold.it/32x32\",\"age\":33,\"eyeColor\":\"green\",\"name\":\"Clara Mcmahon\",\"gender\":\"female\",\"company\":\"QUILM\",\"email\":\"[email protected]\",\"phone\":\"+1 (871) 509-3806\",\"address\":\"391 Schroeders Avenue, Ironton, Hawaii, 1368\",\"about\":\"Commodo aliqua Lorem adipisicing esse in deserunt incididunt quis. Commodo sint amet quis adipisicing exercitation non Lorem aliquip tempor velit incididunt laboris. Ullamco in id anim commodo incididunt sint ad amet.\\r\\n\",\"registered\":\"2014-05-23T05:47:53 -02:00\",\"latitude\":78.629772,\"longitude\":10.274508}";
Stopwatch watch = new Stopwatch();
watch.Start();
Person person = JsonSerializer.Deserialize<Person>(data); // measuring this part
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds);

//...

public class Person
{
    public string _id { get; set; }
    public int index { get; set; }
    public string guid { get; set; }
    public bool isActive { get; set; }
    public string balance { get; set; }
    public string picture { get; set; }
    public int age { get; set; }
    public string eyeColor { get; set; }
    public string name { get; set; }
    public string gender { get; set; }
    public string company { get; set; }
    public string email { get; set; }
    public string phone { get; set; }
    public string address { get; set; }
    public string about { get; set; }
    public string registered { get; set; }
    public float latitude { get; set; }
    public float longtitude { get; set; }
}

结果:

Node.js (v14.15.3) 平均返回

0.0380ms

C# (.NET core、net5.0、Release) 平均返回

40ms

问题:

为什么 C# 的 TYPED JSON 解析相对于 Node.js 的 dynamic JSON 解析表现如此糟糕?

我测量得这么差吗?为什么会出现这种情况?

P.S.:我正在构建一个应用程序,用于侦听 Websocket 并解析每个 Websocket 中的一个 JSON 对象(跨度为几秒),因此这就是为什么我只对一个 JSON 对象进行基准测试。

c# node.js json .net-core benchmarking
1个回答
0
投票

在第一次调用反序列化期间。 System.Text.Json 需要生成一个缓存来将 JSON 映射到类。

后续调用会快很多。

Node.js 不需要它,因为它不会将其映射到类或检查类型。

如果您想要进行苹果与苹果之间的比较,您应该对 JsonElement 使用反序列化,而不是对类进行反序列化,而 JsonElement 也是非结构化的。

PS:如果您想要准确的基准测试,您应该多次循环运行调用以获得可靠的结果。

© www.soinside.com 2019 - 2024. All rights reserved.