मैं CGbR generator में अपनी कक्षाओं खिला की स्वतंत्रता ले लिया। क्योंकि यह शुरुआती चरण में है, यह अभी तक DateTime
का समर्थन नहीं करता है, इसलिए मैंने इसे लंबे समय से बदल दिया। उत्पन्न क्रमबद्धता कोड इस तरह दिखता है:
public int Size
{
get
{
var size = 24;
// Add size for collections and strings
size += Cts == null ? 0 : Cts.Count * 4;
size += Tes == null ? 0 : Tes.Count * 4;
size += Code == null ? 0 : Code.Length;
size += Message == null ? 0 : Message.Length;
return size;
}
}
public byte[] ToBytes(byte[] bytes, ref int index)
{
if (index + Size > bytes.Length)
throw new ArgumentOutOfRangeException("index", "Object does not fit in array");
// Convert Cts
// Two bytes length information for each dimension
GeneratorByteConverter.Include((ushort)(Cts == null ? 0 : Cts.Count), bytes, ref index);
if (Cts != null)
{
for(var i = 0; i < Cts.Count; i++)
{
var value = Cts[i];
value.ToBytes(bytes, ref index);
}
}
// Convert Tes
// Two bytes length information for each dimension
GeneratorByteConverter.Include((ushort)(Tes == null ? 0 : Tes.Count), bytes, ref index);
if (Tes != null)
{
for(var i = 0; i < Tes.Count; i++)
{
var value = Tes[i];
value.ToBytes(bytes, ref index);
}
}
// Convert Code
GeneratorByteConverter.Include(Code, bytes, ref index);
// Convert Message
GeneratorByteConverter.Include(Message, bytes, ref index);
// Convert StartDate
GeneratorByteConverter.Include(StartDate.ToBinary(), bytes, ref index);
// Convert EndDate
GeneratorByteConverter.Include(EndDate.ToBinary(), bytes, ref index);
return bytes;
}
public Td FromBytes(byte[] bytes, ref int index)
{
// Read Cts
var ctsLength = GeneratorByteConverter.ToUInt16(bytes, ref index);
var tempCts = new List<Ct>(ctsLength);
for (var i = 0; i < ctsLength; i++)
{
var value = new Ct().FromBytes(bytes, ref index);
tempCts.Add(value);
}
Cts = tempCts;
// Read Tes
var tesLength = GeneratorByteConverter.ToUInt16(bytes, ref index);
var tempTes = new List<Te>(tesLength);
for (var i = 0; i < tesLength; i++)
{
var value = new Te().FromBytes(bytes, ref index);
tempTes.Add(value);
}
Tes = tempTes;
// Read Code
Code = GeneratorByteConverter.GetString(bytes, ref index);
// Read Message
Message = GeneratorByteConverter.GetString(bytes, ref index);
// Read StartDate
StartDate = DateTime.FromBinary(GeneratorByteConverter.ToInt64(bytes, ref index));
// Read EndDate
EndDate = DateTime.FromBinary(GeneratorByteConverter.ToInt64(bytes, ref index));
return this;
}
मैं इस तरह नमूना वस्तुओं की एक सूची बनाई गई:
var objects = new List<Td>();
for (int i = 0; i < 1000; i++)
{
var obj = new Td
{
Message = "Hello my friend",
Code = "Some code that can be put here",
StartDate = DateTime.Now.AddDays(-7),
EndDate = DateTime.Now.AddDays(2),
Cts = new List<Ct>(),
Tes = new List<Te>()
};
for (int j = 0; j < 10; j++)
{
obj.Cts.Add(new Ct { Foo = i * j });
obj.Tes.Add(new Te { Bar = i + j });
}
objects.Add(obj);
}
Release
निर्माण में मेरी मशीन पर परिणाम:
var watch = new Stopwatch();
watch.Start();
var bytes = BinarySerializer.SerializeMany(objects);
watch.Stop();
आकार : 14 9 000 बाइट
समय: 2.059ms 3.13ms
संपादित करें: CGbR के साथ शुरू 0.4.3 द्विआधारी serializer दिनांक समय का समर्थन करता है। दुर्भाग्य से DateTime.ToBinary
विधि बहुत धीमी है। मैं जल्द ही इसे जल्दी से कुछ हद तक बदल दूंगा।
EDIT2: यूटीसी DateTime
का उपयोग करते समय 1.669ms पर में ToUniversalTime()
प्रदर्शन पुनर्स्थापित किया जाता है और घड़ियों लागू द्वारा।
प्रदर्शन या कोड पैर प्रिंट? – ulrichb
क्या आप मुझसे पूछ रहे हैं कि मुझे प्रदर्शन डेटा या कोड चाहिए? – aron
वह पूछ रहा है कि, "सबसे तेज़ तरीका" से, आपका मतलब प्रदर्शन के संदर्भ में या कोड पदचिह्न के संदर्भ में है। कोड और कार्यान्वयन के मामले में 'बाइनरीफॉर्मेटर' बेहद तेज़ है, लेकिन मार्क की तरह एक समाधान बेंचमार्क में तेजी से प्रदर्शन करेगा। –