好吧,我有答案,而不是猜测。这是测试程序:
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 序列化器确实在缓存这些值。