Json和Xml序列化,啥性能更好?

Posted

技术标签:

【中文标题】Json和Xml序列化,啥性能更好?【英文标题】:Json and Xml serialization, what is better performance?Json和Xml序列化,什么性能更好? 【发布时间】:2012-06-10 14:37:02 【问题描述】:

我必须在文件中存储一些配置信息。在 C# 代码中,配置数据按类表示,在文件中我将把这个类保存为 json 或 xml 格式。那么,序列化json或者xml哪个性能最好呢?

【问题讨论】:

请看下面的帖子,上面写着 JSON [SO LNK][1] [1]: ***.com/questions/7818926/… 与其问什么是最快的,不如问什么是最合适的? XML 配置文件是 .NET 世界公认的标准。在这种情况下,我会选择principle of least surprise(所以,XML)。 我不同意所有关于 JSON 不易被人类阅读的答案。恰恰相反。 J 代表 javascript。在 JSON 还没有出现之前,它的设计初衷就是手写输入和人眼阅读。 XML 不能说同样的话,而且它的可读性要差得多。但无论如何,找到最佳性能很容易。只需用 JSON 和 XML 写出您的配置,然后编写一个序列化每个配置的函数。然后使用 StopWatch 类测量每次执行 1000 次迭代需要多长时间。现在你知道哪个表现更好了。 【参考方案1】:

好吧,我有答案,而不是猜测。这是测试程序:

class Program

    static void Main(string[] args)
    
        string xmlConfig = "";
        string jsonConfig = "";

        Config myConfig = new Config()
        
            value = "My String Value",
            DateStamp = DateTime.Today,
            counter = 42,
            Id = Guid.NewGuid()
        ;

        // Make both strings
        DataContractSerializer xmlSerializer = new DataContractSerializer(typeof(Config));
        using (MemoryStream xmlStream = new MemoryStream())
        
            xmlSerializer.WriteObject(xmlStream, myConfig);
            xmlConfig = Encoding.UTF8.GetString(xmlStream.ToArray());
        

        DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Config));
        using (MemoryStream jsonStream = new MemoryStream())
        
            jsonSerializer.WriteObject(jsonStream, myConfig);
            jsonConfig = Encoding.UTF8.GetString(jsonStream.ToArray());
        

        // Test Single
        var XmlSingleTimer = Stopwatch.StartNew();
        SerializeXML(xmlConfig, 1);
        XmlSingleTimer.Stop();

        var JsonSingleTimer = Stopwatch.StartNew();
        SerializeJSON(jsonConfig, 1);
        JsonSingleTimer.Stop();

        // Test 1000
        var XmlTimer = Stopwatch.StartNew();
        SerializeXML(xmlConfig, 1000);
        XmlTimer.Stop();

        var JsonTimer = Stopwatch.StartNew();
        SerializeJSON(jsonConfig, 1000);
        JsonTimer.Stop();

        // Test 10000
        var XmlTimer2 = Stopwatch.StartNew();
        SerializeXML(xmlConfig, 10000);
        XmlTimer2.Stop();

        var JsonTimer2 = Stopwatch.StartNew();
            SerializeJSON(jsonConfig, 10000);
        JsonTimer2.Stop();

        Console.WriteLine(String.Format("XML Serialization Single: 0ms", XmlSingleTimer.Elapsed.TotalMilliseconds));
        Console.WriteLine(String.Format("JSON Serialization Single: 0ms", JsonSingleTimer.Elapsed.TotalMilliseconds));
        Console.WriteLine();
        Console.WriteLine(String.Format("XML Serialization 1000: 0ms", XmlTimer.Elapsed.TotalMilliseconds));
        Console.WriteLine(String.Format("JSON Serialization 1000: 0ms ", JsonTimer.Elapsed.TotalMilliseconds));
        Console.WriteLine();
        Console.WriteLine(String.Format("XML Serialization 10000: 0ms ", XmlTimer2.ElapsedMilliseconds));
        Console.WriteLine(String.Format("JSON Serialization 10000: 0ms ", JsonTimer2.ElapsedMilliseconds));
    

    public static void SerializeXML(string xml, int iterations)
    
        DataContractSerializer xmlSerializer = new DataContractSerializer(typeof(Config));
        for (int i = 0; i < iterations; i++)
        
            using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
            
                Config serialized = (Config)xmlSerializer.ReadObject(stream);
            
        
    

    public static void SerializeJSON(string json, int iterations)
    
        DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Config));
        for (int i = 0; i < iterations; i++)
        
            using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
            
                Config serialized = (Config)jsonSerializer.ReadObject(stream);
            
        
    


public class Config

    public string value;
    public DateTime DateStamp;
    public int counter;
    public Guid Id;

这是测量的输出:

XML Serialization Single: 2.3764ms
JSON Serialization Single: 2.1432ms

XML Serialization 1000: 13.7754ms
JSON Serialization 1000: 13.747ms

XML Serialization 10000: 100ms
JSON Serialization 10000: 134ms

在 1 次迭代后,JSON 的速度始终快一点。经过 1000 次迭代后,确实没有任何区别。在 10000 次迭代之后,XML 显然更快了。

在这一点上,我无法解释为什么 JSON 一次一个会更快,但 XML 在重复时会更快。可能是由于缓存或库中的一些花哨的东西。 您可以看到 JsonSerializer 是线性扩展的,将迭代次数增加 10 个数量级会使经过的时间线性增加 10 个数量级。虽然 XmlSerializer 的行为不同,但它的性能并没有以线性方式扩展。

我重复了几次,始终得到相同的结果。

因此,如果您只解析一个对象一次,那么 JSON 会稍微好一些。但是,如果您重复解析对象,那么 XML 可能会执行得更好。虽然,我还没有测试过每次迭代时对象值发生变化会发生什么,但这可能会有所不同。

另外请注意,我在这里使用的是本机 Runtime.Serialization 库。其他库可能会产生不同的结果。

编辑:我只是在每次调用字符串时生成一个新的 Guid 和随机 Int 时尝试了这个。它对单次或 10000 次迭代测试没有任何影响。但是对于 1000 次迭代,JSON 大约快 1 毫秒。所以看起来 XML 序列化器确实在缓存这些值。

【讨论】:

如果使用 Newtonsoft.Json 进行 JSON 序列化会很棒.. :) 我给出了所有的代码,你可以使用任何你想要的序列化器来尝试;)【参考方案2】:

当我在 .NET 应用程序中查找配置时,我希望在某处找到一个名为 MyApp.exe.config 的 XML 文件。

坚持使用principle of least surprise 我更喜欢 XML 序列化而不是 JSON。还有一个额外的好处是 XML 格式的配置可以适应Configuration API。两者都具有相同的支持:平台无关、体面的解析器、基于文本的等等。

只有当它成为问题时,性能才是问题。我喜欢在编码之前识别潜在问题,但这通常是关于架构决策引入的性能问题。像这样的东西,很小且相当独立,如果在分析中证明是一个问题,将不难改变。

【讨论】:

【参考方案3】:

Json 对人类的可读性可能比 xml 低,但是 json 生成的文件的大小更小。因此,如果您需要通过网络发送文件,Json 可能是更好的选择,或者如果您希望能够读取它,XML 更好。 另一个好处是,在 .NET 4 中你有 dynamic 关键字,你可以将你的 Json 直接转换为 C# 对象。

【讨论】:

@Arijoon wow...5 岁的评论 :) 无论如何,最近我从事网络应用程序的工作,现在我发现它更具可读性,因为我更习惯它并且编辑器现在更聪明(您可以折叠 json 部分等)。除了 1 种情况:当您的值包含包含新行的文本时。你不能真正格式化你的 json 文本值以包含新行,你必须添加 \n.因此,您会看到一个包含 \n 的大行。【参考方案4】:

在我看来,一切都取决于您需要做什么以及如何实现,这是一篇比较 JSON 和 XML 的好文章。客户端的压缩和反序列化我选择JSON。

祝你好运。

https://dzone.com/articles/json-vs-xml-net-developer%e2%80%99s

【讨论】:

【参考方案5】:

序列化的成本大致相同。不太可能有明显的差异。使用您的用户会觉得修改最舒服的格式(因为它是一个配置文件)。

当您需要通过网络发送 JSON 或 XML 时,可能会出现真正的性能差异。然后,性能取决于您发送的内容量,而且由于 JSON 通常比 XML 更简洁,因此它通常会在网络上表现更好。

【讨论】:

当然,除非启用压缩或者他们使用二进制 XML。根据我的喜好,OPs 问题中有太多未说明的假设。

以上是关于Json和Xml序列化,啥性能更好?的主要内容,如果未能解决你的问题,请参考以下文章

序列化与反序列化之JSON

ProtoBuf简介

Protocol Buffers,一款比xml快100倍的序列化框架

Protocol Buffers,一款比xml快100倍的序列化框架

Jackson 序列化:XML 和 JSON 的不同格式

三种通用应用层协议protobufthriftavro对比,完爆xml,json,http