我必须在文件中存储一些配置信息。在 C# 代码中,配置数据按类表示,在文件中我将把这个类保存为 json 或 xml 格式。那么,序列化 json 或 xml 的最佳性能是什么?
5 回答
好吧,而不是猜测,我有答案。这是测试程序:
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 序列化器确实在缓存这些值。
当我在 .NET 应用程序中查找配置时,我希望在某处找到一个名为 MyApp.exe.config 的 XML 文件。
坚持最不意外的原则,我更喜欢 XML 序列化而不是 JSON。还有一个额外的好处是 XML 格式的配置可以与Configuration API一起使用。两者都具有相同的支持:平台不可知论、体面的解析器、基于文本的等。
只有当它成为问题时,性能才是问题。我喜欢在编码之前识别潜在问题,但这通常是关于架构决策引入的性能问题。像这样的东西,很小且相当独立,如果在分析中证明是一个问题,将不难改变。
json 对人类的可读性可能比 xml 低,但 json 生成的文件的大小更小。因此,如果您需要通过网络发送文件,Json 可能是更好的选择,或者如果您希望能够读取它,XML 更好。另一件好事是,在 .NET 4 中,您有 dynamic 关键字,您可以将 Json 直接转换为 C# 对象。
在我看来,一切都取决于您需要做什么以及如何实现,这是一篇比较 JSON 和 XML 的好文章。客户端的压缩和反序列化我选择 JSON。
祝你好运。
https://dzone.com/articles/json-vs-xml-net-developer%e2%80%99s
序列化的成本大致相同。不太可能有明显的差异。使用您的用户会觉得修改最舒服的格式(因为它是一个配置文件)。
当您需要通过网络发送 JSON 或 XML 时,可能会出现真正的性能差异。然后,性能取决于您发送的内容量,并且由于 JSON 通常比 XML 更简洁,因此它通常在网络上表现更好。