diff --git a/RunBenchmarks.fsx b/RunBenchmarks.fsx index e4e135a..6f5edf3 100644 --- a/RunBenchmarks.fsx +++ b/RunBenchmarks.fsx @@ -14,7 +14,7 @@ open System.Collections.Generic open FSharp.Charting open FSharp.Charting.ChartTypes -open SimlpeSpeedTester.Example +open SimpleSpeedTester.Example open SimpleSpeedTester.Interfaces let prettyPrint (results : Dictionary) = diff --git a/SimpleSpeedTester.sln b/SimpleSpeedTester.sln index 3ab4929..38c3819 100644 --- a/SimpleSpeedTester.sln +++ b/SimpleSpeedTester.sln @@ -33,6 +33,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JsonSerializersBenchmark", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CollectionBenchmark", "examples\CollectionBenchmark\CollectionBenchmark.csproj", "{94F57EB2-21B7-42B3-A885-B2DE5EE74A10}" EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "TestRecord", "examples\TestRecord\TestRecord.fsproj", "{088C6FFB-7156-4172-96D8-32111C602067}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -103,6 +105,16 @@ Global {94F57EB2-21B7-42B3-A885-B2DE5EE74A10}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {94F57EB2-21B7-42B3-A885-B2DE5EE74A10}.Release|Mixed Platforms.Build.0 = Release|Any CPU {94F57EB2-21B7-42B3-A885-B2DE5EE74A10}.Release|x86.ActiveCfg = Release|Any CPU + {088C6FFB-7156-4172-96D8-32111C602067}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {088C6FFB-7156-4172-96D8-32111C602067}.Debug|Any CPU.Build.0 = Debug|Any CPU + {088C6FFB-7156-4172-96D8-32111C602067}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {088C6FFB-7156-4172-96D8-32111C602067}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {088C6FFB-7156-4172-96D8-32111C602067}.Debug|x86.ActiveCfg = Debug|Any CPU + {088C6FFB-7156-4172-96D8-32111C602067}.Release|Any CPU.ActiveCfg = Release|Any CPU + {088C6FFB-7156-4172-96D8-32111C602067}.Release|Any CPU.Build.0 = Release|Any CPU + {088C6FFB-7156-4172-96D8-32111C602067}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {088C6FFB-7156-4172-96D8-32111C602067}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {088C6FFB-7156-4172-96D8-32111C602067}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/examples/BinarySerializersBenchmark/BinarySerializersBenchmark.csproj b/examples/BinarySerializersBenchmark/BinarySerializersBenchmark.csproj index 70664d8..cdbabf6 100644 --- a/examples/BinarySerializersBenchmark/BinarySerializersBenchmark.csproj +++ b/examples/BinarySerializersBenchmark/BinarySerializersBenchmark.csproj @@ -48,6 +48,10 @@ ..\..\packages\fluorinefx.1.2.4\lib\net40\FluorineFx.ServiceBrowser.dll + + + ..\..\packages\FsPickler.0.8.5.1\lib\net45\FsPickler.dll + ..\..\packages\log4net.1.2.10\lib\2.0\log4net.dll @@ -84,6 +88,10 @@ {87b76a3e-3932-47f1-924d-c80a1ae92787} SimpleSpeedTester + + {088c6ffb-7156-4172-96d8-32111c602067} + TestRecord + diff --git a/examples/BinarySerializersBenchmark/BinarySerializersSpeedTest.cs b/examples/BinarySerializersBenchmark/BinarySerializersSpeedTest.cs index 2874317..9561ac6 100644 --- a/examples/BinarySerializersBenchmark/BinarySerializersSpeedTest.cs +++ b/examples/BinarySerializersBenchmark/BinarySerializersSpeedTest.cs @@ -17,7 +17,7 @@ using JsonNetBsonWriter = Newtonsoft.Json.Bson.BsonWriter; using JsonNetJsonSerializer = Newtonsoft.Json.JsonSerializer; -namespace SimlpeSpeedTester.Example +namespace SimpleSpeedTester.Example { using Filbert.Core; @@ -34,6 +34,7 @@ public static class BinarySerializersSpeedTest // the objects to perform the tests with private static readonly List SimpleObjects = Enumerable.Range(1, ObjectsCount).Select(GetSimpleObject).ToList(); + private static readonly List SimpleRecords = Enumerable.Range(1, ObjectsCount).Select(GetSimpleRecord).ToList(); private static readonly List BertSimpleObjects = Enumerable.Range(1, ObjectsCount).Select(GetSimpleObjectBert).ToList(); private static readonly List SimpleObjectsWithFields = Enumerable.Range(1, ObjectsCount).Select(GetSimpleObjectWithFields).ToList(); private static readonly List IserializableSimpleObjects = Enumerable.Range(1, ObjectsCount).Select(GetSerializableSimpleObject).ToList(); @@ -58,7 +59,7 @@ public static Dictionary)); - + results.Add( "Protobuf-Net (with fields)", DoSpeedTest("Protobuf-Net (with fields)", SimpleObjectsWithFields, SerializeWithProtobufNet, DeserializeWithProtobufNet)); @@ -66,22 +67,26 @@ public static Dictionary)); results.Add( "MessagePack (with properties)", DoSpeedTest( - "MessagePack (with properties)", - SimpleObjects, - lst => SerializeWithMessagePack(lst, true), + "MessagePack (with properties)", + SimpleObjects, + lst => SerializeWithMessagePack(lst, true), lst => DeserializeWithMessagePack(lst, true))); results.Add( "MessagePack (with fields)", DoSpeedTest( "MessagePack (with fields)", - SimpleObjectsWithFields, - lst => SerializeWithMessagePack(lst, false), + SimpleObjectsWithFields, + lst => SerializeWithMessagePack(lst, false), lst => DeserializeWithMessagePack(lst, false))); results.Add( @@ -103,6 +108,35 @@ public static Dictionary DeserializeWithFsPickler(List payloads) + { + var fsp = new FsPickler.FsPickler(); + + return + payloads.Select(payload => + { + using (var ms = new MemoryStream(payload)) + { + return fsp.Deserialize(ms); + } + }).ToList(); + } + + private static List SerializeWithFsPickler(List objects) + { + var fsp = new FsPickler.FsPickler(); + + return + objects.Select(o => + { + using (var ms = new MemoryStream()) + { + fsp.Serialize(ms, o); + return ms.ToArray(); + } + }).ToList(); + } + private static Tuple DoSpeedTest( string testGroupName, List objects, Func, List> serializeFunc, Func, List> deserializeFunc) { @@ -162,6 +196,11 @@ private static SimpleObject GetSimpleObject(int id) }; } + private static TestRecords.SimpleRecord GetSimpleRecord(int id) + { + return new TestRecords.SimpleRecord(100000, "Simple", "Planet Earth", Enumerable.Range(0, 10).ToArray()); + } + private static SimpleObjectWithFields GetSimpleObjectWithFields(int id) { return new SimpleObjectWithFields @@ -250,6 +289,31 @@ private static T DeserializeWithProtobufNet(byte[] byteArray) #region Binary Writer + private static int[] ReadScores(BinaryReader reader) + { + var count = reader.ReadInt32(); + return Enumerable.Range(0, count).Select(_ => reader.ReadInt32()).ToArray(); + } + + private static List DeserializeWithBinaryReader(List payloads) + { + return + payloads.Select(o => + { + using (var ms = new MemoryStream(o)) + { + var reader = new BinaryReader(ms); + return new SimpleObject + { + Id = reader.ReadInt32(), + Name = reader.ReadString(), + Address = reader.ReadString(), + Scores = ReadScores(reader) + }; + } + }).ToList(); + } + private static List SerializeWithBinaryWriter(List objects) { return objects.Select(SerializeWithBinaryWriter).ToList(); @@ -264,7 +328,9 @@ private static byte[] SerializeWithBinaryWriter(SimpleObject obj) binaryWriter.Write(obj.Id); binaryWriter.Write(obj.Name); binaryWriter.Write(obj.Address); + binaryWriter.Write(obj.Scores.Length); Array.ForEach(obj.Scores, binaryWriter.Write); + binaryWriter.Flush(); return memStream.ToArray(); diff --git a/examples/BinarySerializersBenchmark/packages.config b/examples/BinarySerializersBenchmark/packages.config index 28b8fa7..da9a854 100644 --- a/examples/BinarySerializersBenchmark/packages.config +++ b/examples/BinarySerializersBenchmark/packages.config @@ -2,6 +2,7 @@ + diff --git a/examples/CollectionBenchmark/CollectionSpeedTest.cs b/examples/CollectionBenchmark/CollectionSpeedTest.cs index 71b3037..b0b911e 100644 --- a/examples/CollectionBenchmark/CollectionSpeedTest.cs +++ b/examples/CollectionBenchmark/CollectionSpeedTest.cs @@ -8,7 +8,7 @@ using SimpleSpeedTester.Core; using SimpleSpeedTester.Interfaces; -namespace SimlpeSpeedTester.Example +namespace SimpleSpeedTester.Example { public class CollectionSpeedTest { diff --git a/examples/CollectionBenchmark/EnumerableExtensions.cs b/examples/CollectionBenchmark/EnumerableExtensions.cs index 5d09666..90d8319 100644 --- a/examples/CollectionBenchmark/EnumerableExtensions.cs +++ b/examples/CollectionBenchmark/EnumerableExtensions.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace SimlpeSpeedTester.Example +namespace SimpleSpeedTester.Example { public static class EnumerableExtensions { diff --git a/examples/JsonSerializersBenchmark/JsonSerializersSpeedTest.cs b/examples/JsonSerializersBenchmark/JsonSerializersSpeedTest.cs index d210283..94bd779 100644 --- a/examples/JsonSerializersBenchmark/JsonSerializersSpeedTest.cs +++ b/examples/JsonSerializersBenchmark/JsonSerializersSpeedTest.cs @@ -20,7 +20,7 @@ using JsonFxReader = JsonFx.Json.JsonReader; using JsonFxWriter = JsonFx.Json.JsonWriter; -namespace SimlpeSpeedTester.Example +namespace SimpleSpeedTester.Example { /// /// Demo program which compares the serializatoin and deserialization speed of 4 popular JSON serializers diff --git a/examples/SimpleSpeedTester.Example/ExceptionOnlyTestOutcomeFilter.cs b/examples/SimpleSpeedTester.Example/ExceptionOnlyTestOutcomeFilter.cs index 8eb0a44..e6c47ef 100644 --- a/examples/SimpleSpeedTester.Example/ExceptionOnlyTestOutcomeFilter.cs +++ b/examples/SimpleSpeedTester.Example/ExceptionOnlyTestOutcomeFilter.cs @@ -3,7 +3,7 @@ using SimpleSpeedTester.Core; using SimpleSpeedTester.Interfaces; -namespace SimlpeSpeedTester.Example +namespace SimpleSpeedTester.Example { public sealed class ExceptionOnlyTestOutcomeFilter : ITestOutcomeFilter { diff --git a/examples/SimpleSpeedTester.Example/Program.cs b/examples/SimpleSpeedTester.Example/Program.cs index 4ded8af..c4fd7f7 100644 --- a/examples/SimpleSpeedTester.Example/Program.cs +++ b/examples/SimpleSpeedTester.Example/Program.cs @@ -5,7 +5,7 @@ using SimpleSpeedTester.Core; using SimpleSpeedTester.Core.OutcomeFilters; -namespace SimlpeSpeedTester.Example +namespace SimpleSpeedTester.Example { class Program { diff --git a/examples/SimpleSpeedTester.Example/SimpleSpeedTester.Example.csproj b/examples/SimpleSpeedTester.Example/SimpleSpeedTester.Example.csproj index e3c56d4..6836593 100644 --- a/examples/SimpleSpeedTester.Example/SimpleSpeedTester.Example.csproj +++ b/examples/SimpleSpeedTester.Example/SimpleSpeedTester.Example.csproj @@ -8,8 +8,8 @@ {7ADA7026-5757-4E93-AC72-D7E69DC08433} Exe Properties - SimlpeSpeedTester.Example - SimlpeSpeedTester.Example + SimpleSpeedTester.Example + SimpleSpeedTester.Example v4.5 diff --git a/examples/TestRecord/TestRecord.fsproj b/examples/TestRecord/TestRecord.fsproj new file mode 100644 index 0000000..861163d --- /dev/null +++ b/examples/TestRecord/TestRecord.fsproj @@ -0,0 +1,70 @@ + + + + + Debug + AnyCPU + 2.0 + 088c6ffb-7156-4172-96d8-32111c602067 + Library + TestRecord + TestRecord + v4.5 + 4.3.1.0 + TestRecord + + + true + full + false + false + bin\Debug\ + DEBUG;TRACE + 3 + bin\Debug\TestRecord.XML + + + pdbonly + true + true + bin\Release\ + TRACE + 3 + bin\Release\TestRecord.XML + + + + + True + + + + + + + + + + 11 + + + + + $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets + + + + + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets + + + + + + \ No newline at end of file diff --git a/examples/TestRecord/TestRecords.fs b/examples/TestRecord/TestRecords.fs new file mode 100644 index 0000000..0dc425c --- /dev/null +++ b/examples/TestRecord/TestRecords.fs @@ -0,0 +1,9 @@ +namespace TestRecords + +type SimpleRecord = + { + Id: int + Name: string + Address: string + Scores: int[] + } \ No newline at end of file