14

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

4

5 回答 5

32

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

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: {0}ms", XmlSingleTimer.Elapsed.TotalMilliseconds));
        Console.WriteLine(String.Format("JSON Serialization Single: {0}ms", JsonSingleTimer.Elapsed.TotalMilliseconds));
        Console.WriteLine();
        Console.WriteLine(String.Format("XML Serialization 1000: {0}ms", XmlTimer.Elapsed.TotalMilliseconds));
        Console.WriteLine(String.Format("JSON Serialization 1000: {0}ms ", JsonTimer.Elapsed.TotalMilliseconds));
        Console.WriteLine();
        Console.WriteLine(String.Format("XML Serialization 10000: {0}ms ", XmlTimer2.ElapsedMilliseconds));
        Console.WriteLine(String.Format("JSON Serialization 10000: {0}ms ", 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 序列化器确实在缓存这些值。

于 2014-12-02T20:23:03.050 回答
8

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

坚持最不意外的原则,我更喜欢 XML 序列化而不是 JSON。还有一个额外的好处是 XML 格式的配置可以与Configuration API一起使用。两者都具有相同的支持:平台不可知论、体面的解析器、基于文本的等。

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

于 2012-06-06T14:54:32.110 回答
3

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

于 2012-06-06T14:48:02.130 回答
3

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

祝你好运。

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

于 2013-06-05T20:08:43.377 回答
1

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

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

于 2012-06-06T14:47:16.723 回答