Json和Xml序列化,有什么更好的性能?

Yar*_*ara 12 c# xml serialization json

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

Wed*_*dge 25

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

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;
}
Run Code Online (Sandbox Code Playgroud)

这是测量的输出:

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
Run Code Online (Sandbox Code Playgroud)

经过1次迭代,JSON的出现速度只有一点点.经过1000次迭代后,确实没有任何区别.在10000次迭代之后,XML显然更快.

在这一点上,我无法解释为什么JSON一次会更快,但重复时XML会更快.可能是因为缓存或图书馆中的某些东西.您可以看到JsonSerializer线性缩放,迭代次数增加了10次,将经过的时间线性增加了10个数量级.尽管XmlSerializer表现不同,但它的性能并没有以线性方式缩放.

我重复了几次并且一直得到相同的结果.

所以,经验教训是如果你只是一次解析一个对象,那么JSON会稍好一些.但是如果你反复解析对象,那么XML可能会表现得更好.虽然,我还没有测试如果对象值随着每次迭代而改变会发生什么,这可能会有所不同.

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

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

  • 如果使用用于JSON序列化的`Newtonsoft.Json`将会很棒.. :) (8认同)
  • 我给了所有代码,你可以使用你想要的任何序列化器来尝试它;) (7认同)

Ada*_*rth 6

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

坚持最少惊喜原则我赞成通过JSON进行XML序列化.还有一个额外的好处是XML格式的配置可以适用于配置API.两者都有相同的支持:平台不可知,正确的解析器,基于文本等.

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