Skip to content

Commit

Permalink
- added FastJsonWriter
Browse files Browse the repository at this point in the history
- show serialization result as n/a if none provided
  • Loading branch information
theburningmonk committed Jun 28, 2014
1 parent 68806e0 commit a927788
Show file tree
Hide file tree
Showing 5 changed files with 619 additions and 73 deletions.
13 changes: 8 additions & 5 deletions RunBenchmarks.fsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,26 +22,29 @@ let prettyPrint (results : Dictionary<string, ITestResultSummary * ITestResultSu
results
|> Seq.map (|KeyValue|)
|> Seq.sortBy (function
| _, (ser, null, _) -> ser.AverageExecutionTime
| _, (ser, deser, _) -> ser.AverageExecutionTime + deser.AverageExecutionTime)
| _, (null, deser, _) -> deser.AverageExecutionTime
| _, (ser, null, _) -> ser.AverageExecutionTime
| _, (ser, deser, _) -> (ser.AverageExecutionTime + deser.AverageExecutionTime) / 2.0)
|> Seq.cache

printfn "-----------------------------------------------------------------------------------------------------------------------------"
printfn "%-40s %-22s %-22s %-20s" "Name" "Serialization (ms)" "Deserialization (ms)" "Payload (bytes)"
printfn "-----------------------------------------------------------------------------------------------------------------------------"

for name, (ser, deser, payload) in sortedResults do
printfn "%-40s %-22f %-22s %-20f"
printfn "%-40s %-22s %-22s %-20f"
name
ser.AverageExecutionTime
(match ser with | null -> "n/a" | x -> x.AverageExecutionTime.ToString())
(match deser with | null -> "n/a" | x -> x.AverageExecutionTime.ToString())
payload

printfn "-----------------------------------------------------------------------------------------------------------------------------"

let serResults =
sortedResults
|> Seq.map (function name, (ser, _, _) -> name, ser.AverageExecutionTime)
|> Seq.map (function
| name, (null, _, _) -> name, 0.0
| name, (ser, _, _) -> name, ser.AverageExecutionTime)

let deserResults =
sortedResults
Expand Down
147 changes: 102 additions & 45 deletions examples/BinarySerializersBenchmark/BinarySerializersSpeedTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,33 +47,62 @@ public static Dictionary<string, Tuple<ITestResultSummary, ITestResultSummary, d

results.Add(
"BinaryFormatter (with properties)",
DoSpeedTest("BinaryFormatter (with properties)", SimpleObjects, SerializeWithBinaryFormatter, DeserializeWithBinaryFormatter<SimpleObject>));
DoSpeedTest(
"BinaryFormatter (with properties)",
SimpleObjects,
SerializeWithBinaryFormatter,
DeserializeWithBinaryFormatter<SimpleObject>));

results.Add(
"BinaryFormatter (with fields)",
DoSpeedTest("BinaryFormatter (with fields)", SimpleObjectsWithFields, SerializeWithBinaryFormatter, DeserializeWithBinaryFormatter<SimpleObjectWithFields>));
DoSpeedTest(
"BinaryFormatter (with fields)",
SimpleObjectsWithFields,
SerializeWithBinaryFormatter,
DeserializeWithBinaryFormatter<SimpleObjectWithFields>));

// speed test binary formatter when used with an ISerializable type
results.Add(
"BinaryFormatter (with ISerializable)",
DoSpeedTest("BinaryFormatter (with ISerializable)", IserializableSimpleObjects, SerializeWithBinaryFormatter, DeserializeWithBinaryFormatter<IserializableSimpleObject>));
DoSpeedTest(
"BinaryFormatter (with ISerializable)",
IserializableSimpleObjects,
SerializeWithBinaryFormatter,
DeserializeWithBinaryFormatter<IserializableSimpleObject>));

results.Add(
"Protobuf-Net (with properties)",
DoSpeedTest("Protobuf-Net (with properties)", SimpleObjects, SerializeWithProtobufNet, DeserializeWithProtobufNet<SimpleObject>));
DoSpeedTest(
"Protobuf-Net (with properties)",
SimpleObjects,
SerializeWithProtobufNet,
DeserializeWithProtobufNet<SimpleObject>));

results.Add(
"Protobuf-Net (with fields)",
DoSpeedTest("Protobuf-Net (with fields)", SimpleObjectsWithFields, SerializeWithProtobufNet, DeserializeWithProtobufNet<SimpleObjectWithFields>));
DoSpeedTest(
"Protobuf-Net (with fields)",
SimpleObjectsWithFields,
SerializeWithProtobufNet,
DeserializeWithProtobufNet<SimpleObjectWithFields>));

// speed test binary writer (only for reference, won't be able to deserialize)
results.Add(
"BinaryWriter*",
DoSpeedTest("BinaryWriter", SimpleObjects, SerializeWithBinaryWriter, DeserializeWithBinaryReader));
"BinaryWriter",
DoSpeedTest(
"BinaryWriter",
SimpleObjects,
SerializeWithBinaryWriter,
DeserializeWithBinaryReader,
ignoreDeserializationResult: true));

results.Add(
"FsPickler (F# Record)",
DoSpeedTest("FsPickler", SimpleRecords, SerializeWithFsPickler, DeserializeWithFsPickler<TestRecords.SimpleRecord>));
"FsPickler (F# records)",
DoSpeedTest(
"FsPickler",
SimpleRecords,
SerializeWithFsPickler,
DeserializeWithFsPickler<TestRecords.SimpleRecord>));

results.Add(
"MessagePack (with properties)",
Expand All @@ -93,54 +122,46 @@ public static Dictionary<string, Tuple<ITestResultSummary, ITestResultSummary, d

results.Add(
"MessageShark (with properties)",
DoSpeedTest("MessageShark (with properties)", SimpleObjects, SerializeWithMessageShark, DeserializeWithMessageShark<SimpleObject>));
DoSpeedTest(
"MessageShark (with properties)",
SimpleObjects,
SerializeWithMessageShark,
DeserializeWithMessageShark<SimpleObject>));

results.Add(
"FluorineFx",
DoSpeedTest("FluorineFx", SimpleObjects, SerializeWithFluorineFx, DeserializeWithFluorineFx<SimpleObject>));
DoSpeedTest(
"FluorineFx",
SimpleObjects,
SerializeWithFluorineFx,
DeserializeWithFluorineFx<SimpleObject>));

results.Add(
"Filbert",
DoSpeedTest("Filbert", BertSimpleObjects, SerializeWithFilbert, DeserializeWithFilbert));
DoSpeedTest(
"Filbert",
BertSimpleObjects,
SerializeWithFilbert,
DeserializeWithFilbert));

results.Add(
"Json.Net BSON",
DoSpeedTest("Json.Net BSON", SimpleObjects, SerializeWithJsonNetBson, DeserializeWithJsonNetBson<SimpleObject>));
DoSpeedTest(
"Json.Net BSON",
SimpleObjects,
SerializeWithJsonNetBson,
DeserializeWithJsonNetBson<SimpleObject>));

return results;
}

private static List<T> DeserializeWithFsPickler<T>(List<byte[]> payloads)
{
var fsp = FsPickler.CreateBinary();

return
payloads.Select(payload =>
{
using (var ms = new MemoryStream(payload))
{
return fsp.Deserialize<T>(ms);
}
}).ToList();
}

private static List<byte[]> SerializeWithFsPickler<T>(List<T> objects)
{
var fsp = FsPickler.CreateBinary();

return
objects.Select(o =>
{
using (var ms = new MemoryStream())
{
fsp.Serialize(ms, o);
return ms.ToArray();
}
}).ToList();
}

private static Tuple<ITestResultSummary, ITestResultSummary, double> DoSpeedTest<T>(
string testGroupName, List<T> objects, Func<List<T>, List<byte[]>> serializeFunc, Func<List<byte[]>, List<T>> deserializeFunc)
string testGroupName,
List<T> objects,
Func<List<T>, List<byte[]>> serializeFunc,
Func<List<byte[]>, List<T>> deserializeFunc,
bool ignoreSerializationResult = false,
bool ignoreDeserializationResult = false)
{
var byteArrays = new List<byte[]>();

Expand Down Expand Up @@ -173,7 +194,10 @@ private static Tuple<ITestResultSummary, ITestResultSummary, double> DoSpeedTest

Console.WriteLine("--------------------------------------------------------\n\n");

return Tuple.Create(serializationTestSummary, deserializationTestSummary, avgPayload);
return Tuple.Create(
ignoreSerializationResult ? null : serializationTestSummary,
ignoreDeserializationResult ? null : deserializationTestSummary,
avgPayload);
}

private static Bert GetSimpleObjectBert(int id)
Expand Down Expand Up @@ -475,6 +499,39 @@ private static T DeserializeWithJsonNetBson<T>(byte[] byteArray, JsonNetJsonSeri

#endregion

#region FsPickler

private static List<T> DeserializeWithFsPickler<T>(List<byte[]> payloads)
{
var fsp = FsPickler.CreateBinary();

return
payloads.Select(payload =>
{
using (var ms = new MemoryStream(payload))
{
return fsp.Deserialize<T>(ms);
}
}).ToList();
}

private static List<byte[]> SerializeWithFsPickler<T>(List<T> objects)
{
var fsp = FsPickler.CreateBinary();

return
objects.Select(o =>
{
using (var ms = new MemoryStream())
{
fsp.Serialize(ms, o);
return ms.ToArray();
}
}).ToList();
}

#endregion

#region Serialization Objects

[Serializable]
Expand Down Expand Up @@ -547,4 +604,4 @@ public void GetObjectData(SerializationInfo info, StreamingContext context)

#endregion
}
}
}
Loading

0 comments on commit a927788

Please sign in to comment.