c# - Json和Xml序列化,哪个性能更好?

标签 c# xml json serialization

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

最佳答案

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

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 可能会表现得更好。虽然,我还没有测试如果对象值随着每次迭代而改变会发生什么,但这可能会有所不同。

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

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

关于c# - Json和Xml序列化,哪个性能更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10916591/

相关文章:

c# - 是否可以将数组绑定(bind)到 DataGridView 控件?

c# - ASP.NET Core MVC 本地化警告 : AcceptLanguageHeaderRequestCultureProvider returned the following unsupported cultures

java - Android:调用 EditText getText() 方法时出现 NullPointerException

xml - 从 Sql Server 列中的 XML 中提取数据

javascript - Jquery表不显示

iphone - 解析 JSON 并更改我的模型而不阻塞 UI

c# - 使用表达式从 Lambda 创建安全的深层属性访问器

c# - 在两台物理服务器上托管 ASP.NET MVC 项目

xml - Xpath 获取当前节点的值

json - 获取json对象