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序列化器确实在缓存这些值.