मैं अक्सर पढ़ता हूं कि बाइनरीफॉर्मेटर के बेहतर प्रदर्शन तब XmlSerializer है। जिज्ञासा से, मैंने एक टेस्ट-ऐप लिखा था।प्रदर्शन: बाइनरीफॉर्मेटर बनाम एक्सएमएलएसरियलाइज़र
एक wtf पल ... एक्सएमएल बिन (विशेष रूप से deserialization) से इतना तेज क्यों है?
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Xml.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
namespace SerPlayground
{
class Program
{
static void Main(string[] args)
{
var items = new List<TestClass>();
for (int i = 0; i < 1E6; i++)
{
items.Add(new TestClass() { Name = i.ToString(), Id = i });
}
File.Delete("test.bin");
using (var target = new FileStream("test.bin", FileMode.OpenOrCreate))
{
System.Threading.Thread.Sleep(1000);
var bin = new BinaryFormatter();
var start = DateTime.Now;
bin.Serialize(target, items);
Console.WriteLine("Bin: {0}", (DateTime.Now - start).TotalMilliseconds);
target.Position = 0;
System.Threading.Thread.Sleep(1000);
start = DateTime.Now;
bin.Deserialize(target);
Console.WriteLine("Bin-D: {0}", (DateTime.Now - start).TotalMilliseconds);
}
File.Delete("test.xml");
using (var target = new FileStream("test.xml", FileMode.OpenOrCreate))
{
System.Threading.Thread.Sleep(1000);
var xml = new XmlSerializer(typeof(List<TestClass>));
var start = DateTime.Now;
xml.Serialize(target, items);
Console.WriteLine("Xml: {0}", (DateTime.Now - start).TotalMilliseconds);
target.Position = 0;
System.Threading.Thread.Sleep(1000);
start = DateTime.Now;
xml.Deserialize(target);
Console.WriteLine("Xml-D: {0}", (DateTime.Now - start).TotalMilliseconds);
}
Console.ReadKey();
}
}
[Serializable]
public class TestClass
{
public string Name { get; set; }
public int Id { get; set; }
}
}
मेरे परिणाम:
Bin: 13472.7706
Bin-D: 121131.9284
Xml: 8917.51
Xml-D: 12841.7345
Deserialization क्रमबद्धता की तुलना में कहीं धीमी है। क्या आप अपना नमूना दोनों को करने के लिए संशोधित कर सकते हैं? यह एक और अधिक दिलचस्प तुलना होगी। –
हाय, मैं आपके कुछ परीक्षणों को एकाधिक (100+?) बार चलाने पर विचार करता हूं - या तो लूप में या बिना स्टार्टअप (फॉर्मेटर्स/सीरियलाइज़र बनाना) के साथ। कई और रनों के परिणाम को समय देने से आपको प्रदर्शन की एक और सटीक तस्वीर मिल सकती है। समय-समय पर स्टॉपवॉच क्लास का उपयोग करने पर भी विचार करें क्योंकि मुझे लगता है कि यह उच्च-प्रदर्शन टाइमर का उपयोग करता है जहां कहीं भी है। यदि आपको अभी भी एक तेज़ एक्सएमएल सीरियलाइजेशन मिलता है तो यह जानना अच्छा होगा कि क्यों! – Jennifer
मैंने हमेशा यह समझा है कि नेटवर्क हस्तांतरण के संबंध में बाइनरी "तेज़" है, क्योंकि इसमें कम बाइट्स होंगे। मुझे उम्मीद है कि अंतर स्पष्ट होने के लिए यह एक बहुत भारी पेलोड लेगा, हालांकि। – kbrimington