Repository: nanoframework/nanoFramework.MessagePack
Pull request #6: Added benchmarks project
Author: login: RelaxSpirit
Labels: name: Type: documentation
name: Area: Config-and-Build
Created: 2025-04-22T18:18:16Z | Merged: 2025-04-23T14:45:54Z

## Description
Added the benchmark project.
Fix README samples and benchmark description.

## Motivation and Context
Visual benchmark results are needed.
Updating the README.

## How Has This Been Tested?
Benchmarks in virtual nanoDevice.

## Types of changes
<!--- What types of changes does this PR introduce? Put an `x` in all the boxes that apply: -->
- [ ] Improvement (non-breaking change that improves a feature, code or algorithm)
- [ ] Bug fix (non-breaking change which fixes an issue with code or algorithm)
- [ ] New feature (non-breaking change which adds functionality to code)
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
- [x] Config and build (change in the configuration and build system, has no impact on code or features)
- [ ] Dependencies (update dependencies and changes associated, has no impact on code or features)
- [ ] Unit Tests (add new Unit Test(s) or improved existing one(s), has no impact on code or features)
- [x] Documentation (changes or updates in the documentation, has no impact on code or features)

## Checklist:
<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->
<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
<!--- PLEASE PLEASE PLEASE don't tick all of them just because -->
- [x] My code follows the code style of this project (only if there are changes in source code).
- [ ] My changes require an update to the documentation (there are changes that require the docs website to be updated).
- [x] I have updated the documentation accordingly (the changes require an update on the docs in this repo).
- [x] I have read the [CONTRIBUTING](https://github.com/nanoframework/.github/blob/main/CONTRIBUTING.md) document.
- [x] I have tested everything locally and all new and existing tests passed (only if there are changes in source code).
- [ ] I have added new tests to cover my changes.



<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **Chores**
  - Added a lock file to specify exact versions of dependencies for improved consistency and reproducibility in the project.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/NFUnitTest/NFUnitTest.nfproj b/NFUnitTest/NFUnitTest.nfproj
index 0ad733a..c426989 100644
--- a/NFUnitTest/NFUnitTest.nfproj
+++ b/NFUnitTest/NFUnitTest.nfproj
@@ -1,4 +1,4 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="Current" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup Label="Globals">
     <NanoFrameworkProjectSystemPath>$(MSBuildExtensionsPath)\nanoFramework\v1.0\</NanoFrameworkProjectSystemPath>
diff --git a/README.md b/README.md
index 05b113a..85a6c89 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-﻿[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=nanoframework_nanoFramework.MessagePack&metric=alert_status)](https://sonarcloud.io/dashboard?id=nanoframework_nanoFramework.MessagePack) [![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=nanoframework_nanoFramework.MessagePack&metric=reliability_rating)](https://sonarcloud.io/dashboard?id=nanoframework_nanoFramework.MessagePack) [![NuGet](https://img.shields.io/nuget/dt/nanoFramework.MessagePack.svg?label=NuGet&style=flat&logo=nuget)](https://www.nuget.org/packages/nanoFramework.MessagePack/) [![#yourfirstpr](https://img.shields.io/badge/first--timers--only-friendly-blue.svg)](https://github.com/nanoframework/Home/blob/main/CONTRIBUTING.md) [![Discord](https://img.shields.io/discord/478725473862549535.svg?logo=discord&logoColor=white&label=Discord&color=7289DA)](https://discord.gg/gCyBu8T)
+﻿﻿[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=nanoframework_nanoFramework.MessagePack&metric=alert_status)](https://sonarcloud.io/dashboard?id=nanoframework_nanoFramework.MessagePack) [![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=nanoframework_nanoFramework.MessagePack&metric=reliability_rating)](https://sonarcloud.io/dashboard?id=nanoframework_nanoFramework.MessagePack) [![NuGet](https://img.shields.io/nuget/dt/nanoFramework.MessagePack.svg?label=NuGet&style=flat&logo=nuget)](https://www.nuget.org/packages/nanoFramework.MessagePack/) [![#yourfirstpr](https://img.shields.io/badge/first--timers--only-friendly-blue.svg)](https://github.com/nanoframework/Home/blob/main/CONTRIBUTING.md) [![Discord](https://img.shields.io/discord/478725473862549535.svg?logo=discord&logoColor=white&label=Discord&color=7289DA)](https://discord.gg/gCyBu8T)
 
 ![nanoFramework logo](https://raw.githubusercontent.com/nanoframework/Home/main/resources/logo/nanoFramework-repo-logo.png)
 
@@ -151,7 +151,7 @@ After completing these steps, the serialization/deserialization of the object fo
                 {
                     WordDictionary = new ArrayList
                     {
-                        "MessagePak",
+                        "MessagePack",
                         "Hello",
                         "at",
                         "nanoFramework!",
@@ -178,30 +178,33 @@ After completing these steps, the serialization/deserialization of the object fo
                 {
                     StringBuilder sb = new();
                     var length = reader.ReadArrayLength();
-        
-                    for(int i = 0; i < length; i++)
+                    var intConverter = ConverterContext.GetConverter(typeof(int));
+
+                    for (int i = 0; i < length; i++)
                     {
-                        sb.Append(SharedWordDictionary.WordDictionary[i]);
+                        int wordIndex = (int)intConverter.Read(reader)!;
+                        sb.Append(SharedWordDictionary.WordDictionary[wordIndex]);
                         sb.Append(' ');
                     }
                     if (sb.Length > 0)
                         sb.Remove(sb.Length - 1, 1);
-        
+
                     return new SecureMessage(sb.ToString());
                 }
-        
+
                 public void Write(SecureMessage value, [NotNull] IMessagePackWriter writer)
                 {
                     var messageWords = value.Message.Split(' ');
-        
-                    uint length = BitConverter.ToUInt32(BitConverter.GetBytes(messageWords.Length), 0);
+
+                    uint length = (uint)messageWords.Length;
                     writer.WriteArrayHeader(length);
-        
+
                     var intConverter = ConverterContext.GetConverter(typeof(int));
-        
+
                     foreach (var word in messageWords)
                     {
-                        intConverter.Write(SharedWordDictionary.WordDictionary.IndexOf(word), writer);
+                        int wordIndex = SharedWordDictionary.WordDictionary.IndexOf(word);
+                        intConverter.Write(wordIndex, writer);
                     }
                 }
         
@@ -245,6 +248,43 @@ After completing these steps, the serialization/deserialization of the object fo
         }
    ```
 
+## Benchmarks
+
+The measurements were carried out on the developer's local computer in a virtual nanoDevice:
+
+ ```text
+===============================================================
+==========         Comparative benchmarks data       ==========
+==========                                           ==========
+========== Json string size:           3957 bytes    ==========
+========== BinaryFormatter array size: 1079 bytes    ==========
+========== MessagePack array size:     2444 bytes    ==========
+==========                                           ==========
+===============================================================
+
+Console export: ComparativeDeserializationBenchmark benchmark class.
+
+| ------------------------------------------------------------------------------ |
+| MethodName                          | IterationCount | Mean    | Min   | Max   |
+| ------------------------------------------------------------------------------ |
+| JsonDeserializationBenchmark        | 10             | 27.5 ms | 22 ms | 37 ms |
+| BinaryDeserializationBenchmark      | 10             | 0.1 ms  | 0 ms  | 1 ms  |
+| MessagePackDeserializationBenchmark | 10             | 23.7 ms | 19 ms | 34 ms |
+| ------------------------------------------------------------------------------ |
+
+Console export: ComparativeSerializationBenchmark benchmark class.
+
+
+| ---------------------------------------------------------------------------- |
+| MethodName                        | IterationCount | Mean    | Min   | Max   |
+| ---------------------------------------------------------------------------- |
+| JsonSerializationBenchmark        | 10             | 18.9 ms | 16 ms | 25 ms |
+| BinarySerializationBenchmark      | 10             | 0.1 ms  | 0 ms  | 1 ms  |
+| MessagePackSerializationBenchmark | 10             | 9.8 ms  | 9 ms  | 14 ms |
+| ---------------------------------------------------------------------------- |
+```
+As it can be seen from the benchmark results above, in what concerns speed and compaction, `MessagePack` performs better than the Json serializer. Comming at no surprise, Binary serialization is the most performant one.
+
 ## Acknowledgements
 
 The initial version of the MessagePack library was coded by [Spirin Dmitriy](https://github.com/RelaxSpirit), who has kindly handed over the library to the .NET **nanoFramework** project.
diff --git a/nanoFramework.MessagePack.Benchmark/Base/BaseIterationBenchmark.cs b/nanoFramework.MessagePack.Benchmark/Base/BaseIterationBenchmark.cs
new file mode 100644
index 0000000..0b5761f
--- /dev/null
+++ b/nanoFramework.MessagePack.Benchmark/Base/BaseIterationBenchmark.cs
@@ -0,0 +1,39 @@
+﻿// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace nanoFramework.MessagePack.Benchmark.Base
+{
+    using System;
+
+    /// <summary>
+    /// Base benchmark class.
+    /// </summary>
+    public abstract class BaseIterationBenchmark
+    {
+        /// <summary>
+        /// Internal iteration count.
+        /// </summary>
+        protected virtual int _iterationCount => 20;
+
+        /// <summary>
+        /// Call iteration benchmark method.
+        /// </summary>
+        /// <param name="methodToRun">Iteration benchmark method.</param>
+        /// <exception cref="ArgumentNullException">iteration benchmark method is <see  cref="null"/></exception>
+        protected void RunInIteration(Action methodToRun)
+        {
+            if (methodToRun == null)
+            {
+                throw new ArgumentNullException(nameof(methodToRun));
+            }
+            else
+            {
+                int step = 0;
+                while (step++ < _iterationCount)
+                {
+                    methodToRun();
+                }
+            }
+        }
+    }
+}
diff --git a/nanoFramework.MessagePack.Benchmark/Data/ComparativeTestObjects.cs b/nanoFramework.MessagePack.Benchmark/Data/ComparativeTestObjects.cs
new file mode 100644
index 0000000..6b530ad
--- /dev/null
+++ b/nanoFramework.MessagePack.Benchmark/Data/ComparativeTestObjects.cs
@@ -0,0 +1,542 @@
+﻿// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace nanoFramework.MessagePack.Benchmark.Data
+{
+    using System;
+    using System.Runtime.Serialization.Formatters.Binary;
+    using nanoFramework.Json;
+
+    /// <summary>
+    /// Test data.
+    /// </summary>
+    internal class ComparativeTestObjects
+    {
+        /// <summary>
+        /// Test json text.
+        /// </summary>
+        internal const string TestJson = @"{
+	""StatusUpdateTime"": ""0001-01-01T00:00:00Z"",
+""LastActivityTime"": ""2021-06-03T05:52:41.4683112Z"",
+""Web_app"": {
+  ""Servlet"": [   
+    {
+      ""Servlet_name"": ""cofaxCDS"",
+      ""Servlet_class"": ""org.cofax.cds.CDSServlet"",
+      ""Init_param"": {
+        ""ConfigGlossaryInstallationAt"": ""Philadelphia, PA"",
+        ""ConfigGlossaryAdminEmail"": ""ksm@pobox.com"",
+        ""ConfigGlossaryPoweredBy"": ""Cofax"",
+        ""ConfigGlossaryPoweredByIcon"": ""/images/cofax.gif"",
+        ""ConfigGlossaryPtaticPath"": ""/content/static"",
+        ""TemplateProcessorClass"": ""org.cofax.WysiwygTemplate"",
+        ""TemplateLoaderClass"": ""org.cofax.FilesTemplateLoader"",
+        ""TemplatePath"": ""templates"",
+        ""TemplateOverridePath"": """",
+        ""DefaultListTemplate"": ""listTemplate.htm"",
+        ""DefaultFileTemplate"": ""articleTemplate.htm"",
+        ""UseJSP"": false,
+        ""JspListTemplate"": ""listTemplate.jsp"",
+        ""JspFileTemplate"": ""articleTemplate.jsp"",
+        ""CachePackageTagsTrack"": 200,
+        ""CachePackageTagsStore"": 200,
+        ""CachePackageTagsRefresh"": 60,
+        ""CacheTemplatesTrack"": 100,
+        ""CacheTemplatesStore"": 50,
+        ""CacheTemplatesRefresh"": 15,
+        ""CachePagesTrack"": 200,
+        ""CachePagesStore"": 100,
+        ""CachePagesRefresh"": 10,
+        ""CachePagesDirtyRead"": 10,
+        ""SearchEngineListTemplate"": ""forSearchEnginesList.htm"",
+        ""SearchEngineFileTemplate"": ""forSearchEngines.htm"",
+        ""SearchEngineRobotsDb"": ""WEB_INF/robots.db"",
+        ""UseDataStore"": true,
+        ""DataStoreClass"": ""org.cofax.SqlDataStore"",
+        ""RedirectionClass"": ""org.cofax.SqlRedirection"",
+        ""DataStoreName"": ""cofax"",
+        ""DataStoreDriver"": ""com.microsoft.jdbc.sqlserver.SQLServerDriver"",
+        ""DataStoreUrl"": ""jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon"",
+        ""DataStoreUser"": ""sa"",
+        ""DataStorePassword"": ""dataStoreTestQuery"",
+        ""DataStoreTestQuery"": ""SET NOCOUNT ON;select test='test';"",
+        ""DataStoreLogFile"": ""/usr/local/tomcat/logs/datastore.log"",
+        ""DataStoreInitConns"": 10,
+        ""DataStoreMaxConns"": 100,
+        ""DataStoreConnUsageLimit"": 100,
+        ""DataStoreLogLevel"": ""debug"",
+        ""MaxUrlLength"": 500}},
+    {
+      ""Servlet_name"": ""cofaxEmail"",
+      ""Servlet_class"": ""org.cofax.cds.EmailServlet"",
+      ""Init_param"": {
+      ""MailHost"": ""mail1"",
+      ""MailHostOverride"": ""mail2""}},
+    {
+      ""Servlet_name"": ""cofaxAdmin"",
+      ""Servlet_class"": ""org.cofax.cds.AdminServlet""},
+ 
+    {
+      ""Servlet_name"": ""fileServlet"",
+      ""Servlet_class"": ""org.cofax.cds.FileServlet""},
+    {
+      ""Servlet_name"": ""cofaxTools"",
+      ""Servlet_class"": ""org.cofax.cms.CofaxToolsServlet"",
+      ""Snit_param"": {
+        ""TemplatePath"": ""toolstemplates/"",
+        ""Log"": 1,
+        ""LogLocation"": ""/usr/local/tomcat/logs/CofaxTools.log"",
+        ""LogMaxSize"": """",
+        ""DataLog"": 1,
+        ""DataLogLocation"": ""/usr/local/tomcat/logs/dataLog.log"",
+        ""DataLogMaxSize"": """",
+        ""RemovePageCache"": ""/content/admin/remove?cache=pages&id="",
+        ""RemoveTemplateCache"": ""/content/admin/remove?cache=templates&id="",
+        ""FileTransferFolder"": ""/usr/local/tomcat/webapps/content/fileTransferFolder"",
+        ""LookInContext"": 1,
+        ""AdminGroupID"": 4,
+        ""BetaServer"": true}}],
+  ""Servlet_mapping"": {
+    ""CofaxCDS"": ""/"",
+    ""CofaxEmail"": ""/cofaxutil/aemail/*"",
+    ""CofaxAdmin"": ""/admin/*"",
+    ""FileServlet"": ""/static/*"",
+    ""CofaxTools"": ""/tools/*""},
+ 
+  ""Taglib"": {
+    ""Taglib_uri"": ""cofax.tld"",
+    ""Taglib_location"": ""/WEB_INF/tlds/cofax.tld""}}}";
+
+        /// <summary>
+        /// Gets json deserialize option.
+        /// </summary>
+        internal static readonly JsonSerializerOptions JsonSerializerOptions = new JsonSerializerOptions() { PropertyNameCaseInsensitive = true };
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ComparativeTestObjects"/> class.
+        /// </summary>
+        internal ComparativeTestObjects()
+        {
+            TestObject = (TestObjectClass)JsonConvert.DeserializeObject(TestJson, typeof(TestObjectClass), JsonSerializerOptions);
+            TestObjectMsgPackBytes = MessagePackSerializer.Serialize(TestObject);
+            TestObjectBinaryBytes = BinaryFormatter.Serialize(TestObject);
+        }
+
+        /// <summary>
+        /// Gets test object for deserialize <see cref="TestJson"/>.
+        /// </summary>
+        internal static TestObjectClass TestObject { get; private set; }
+
+        /// <summary>
+        /// Gets byte array for test object used by <see cref="MessagePack"/>.
+        /// </summary>
+        internal static byte[] TestObjectMsgPackBytes { get; private set; }
+
+        /// <summary>
+        /// Gets byte array for test object used by <see cref="BinaryFormatter"/>.
+        /// </summary>
+        internal static byte[] TestObjectBinaryBytes { get; private set; }
+
+        /// <summary>
+        /// Dummy test serialization object sub class.
+        /// </summary>
+        [Serializable]
+        public class InitParam
+        {
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string ConfigGlossaryInstallationAt { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string ConfigGlossaryAdminEmail { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string ConfigGlossaryPoweredBy { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string ConfigGlossaryPoweredByIcon { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string ConfigGlossaryPtaticPath { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string TemplateProcessorClass { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string TemplateLoaderClass { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string TemplatePath { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string TemplateOverridePath { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string DefaultListTemplate { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string DefaultFileTemplate { get; set; }
+
+            /// <summary>
+            /// Gets or sets a value indicating whether <see langword="true"/>. Not used.
+            /// </summary>
+            public bool UseJSP { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string JspListTemplate { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string JspFileTemplate { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public int CachePackageTagsTrack { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public int CachePackageTagsStore { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public int CachePackageTagsRefresh { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public int CacheTemplatesTrack { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public int CacheTemplatesStore { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public int CacheTemplatesRefresh { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public int CachePagesTrack { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public int CachePagesStore { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public int CachePagesRefresh { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public int CachePagesDirtyRead { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string SearchEngineListTemplate { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string SearchEngineFileTemplate { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string SearchEngineRobotsDb { get; set; }
+
+            /// <summary>
+            /// Gets or sets a value indicating whether <see langword="true"/>. Not used.
+            /// </summary>
+            public bool UseDataStore { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string DataStoreClass { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string RedirectionClass { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string DataStoreName { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string DataStoreDriver { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string DataStoreUrl { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string DataStoreUser { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string DataStorePassword { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string DataStoreTestQuery { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string DataStoreLogFile { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public int DataStoreInitConns { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public int DataStoreMaxConns { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public int DataStoreConnUsageLimit { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string DataStoreLogLevel { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public int MaxUrlLength { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string MailHost { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string MailHostOverride { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public int Log { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string LogLocation { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string LogMaxSize { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public int DataLog { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string DataLogLocation { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string DataLogMaxSize { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string RemovePageCache { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string RemoveTemplateCache { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string FileTransferFolder { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public int LookInContext { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public int AdminGroupID { get; set; }
+
+            /// <summary>
+            /// Gets or sets a value indicating whether <see langword="true"/>. Not used.
+            /// </summary>
+            public bool BetaServer { get; set; }
+        }
+
+        /// <summary>
+        /// Dummy main test serialization object class.
+        /// </summary>
+        [Serializable]
+        public class TestObjectClass
+        {
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public DateTime StatusUpdateTime { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public DateTime LastActivityTime { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public WebApp Web_app { get; set; }
+        }
+
+        /// <summary>
+        /// Test serialization object sub class.
+        /// </summary>
+        [Serializable]
+        public class Servlet
+        {
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string Servlet_name { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string Servlet_class { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public InitParam Init_param { get; set; }
+        }
+
+        /// <summary>
+        /// Dummy test serialization object sub class.
+        /// </summary>
+        [Serializable]
+        public class ServletMapping
+        {
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string CofaxCDS { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string CofaxEmail { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string CofaxAdmin { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string FileServlet { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string CofaxTools { get; set; }
+        }
+
+        /// <summary>
+        /// Dummy test serialization object sub class.
+        /// </summary>
+        [Serializable]
+        public class Taglib
+        {
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string Taglib_uri { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public string Taglib_location { get; set; }
+        }
+
+        /// <summary>
+        /// Dummy test serialization object sub class.
+        /// </summary>
+        [Serializable]
+        public class WebApp
+        {
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public Servlet[] Servlet { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public ServletMapping Servlet_mapping { get; set; }
+
+            /// <summary>
+            /// Gets or sets test property. Not used.
+            /// </summary>
+            public Taglib Taglib { get; set; }
+        }
+    }
+}
diff --git a/nanoFramework.MessagePack.Benchmark/Data/ReferenceTestObjects.cs b/nanoFramework.MessagePack.Benchmark/Data/ReferenceTestObjects.cs
new file mode 100644
index 0000000..516e8d5
--- /dev/null
+++ b/nanoFramework.MessagePack.Benchmark/Data/ReferenceTestObjects.cs
@@ -0,0 +1,72 @@
+﻿// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace nanoFramework.MessagePack.Benchmark.Data
+{
+    using System;
+    using System.Collections;
+
+    /// <summary>
+    /// Test references objects.
+    /// </summary>
+    internal class ReferenceTestObjects
+    {
+        /// <summary>
+        /// Initializes static members of the <see cref="ReferenceTestObjects" /> class.
+        /// </summary>
+        static ReferenceTestObjects()
+        {
+            IntArray = new int[100];
+            ByteArray = new byte[100];
+            TwoDimensionalArray = new long[10][];
+            TestHashtable = new Hashtable();
+
+            var random = new Random();
+
+            for (int i = 0; i < IntArray.Length; i++)
+            {
+                IntArray[i] = random.Next(int.MaxValue);
+            }
+
+            for (int i = 0; i < IntArray.Length; i++)
+            {
+                ByteArray[i] = (byte)random.Next(byte.MaxValue);
+            }
+
+            for (int x = 0; x < TwoDimensionalArray.Length; x++)
+            {
+                TwoDimensionalArray[x] = new long[10];
+                for (int y = 0; y < TwoDimensionalArray[x].Length; y++)
+                {
+                    TwoDimensionalArray[x][y] = (long)random.Next(int.MaxValue) * int.MaxValue;
+                }
+            }
+
+            TestHashtable.Add("gender", "Male");
+            TestHashtable.Add("snow", "white");
+            TestHashtable.Add(1, "one");
+            TestHashtable.Add(2, "two");
+            TestHashtable.Add(Guid.NewGuid().ToString(), new string[] { "nano,", "Framework", "Message", "Pack" });
+        }
+
+        /// <summary>
+        /// Gets test int array.
+        /// </summary>
+        internal static int[] IntArray { get; }
+
+        /// <summary>
+        /// Gets test byte array.
+        /// </summary>
+        internal static byte[] ByteArray { get; }
+
+        /// <summary>
+        /// Gets test two-dimensional long array.
+        /// </summary>
+        internal static long[][] TwoDimensionalArray { get; }
+
+        /// <summary>
+        /// Gets test hashtable.
+        /// </summary>
+        internal static Hashtable TestHashtable { get; }
+    }
+}
diff --git a/nanoFramework.MessagePack.Benchmark/DeserializationBenchmarks/ComparativeDeserializationBenchmark.cs b/nanoFramework.MessagePack.Benchmark/DeserializationBenchmarks/ComparativeDeserializationBenchmark.cs
new file mode 100644
index 0000000..c118e81
--- /dev/null
+++ b/nanoFramework.MessagePack.Benchmark/DeserializationBenchmarks/ComparativeDeserializationBenchmark.cs
@@ -0,0 +1,61 @@
+﻿// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace nanoFramework.MessagePack.Benchmark.DeserializationBenchmarks
+{
+    using System.Runtime.Serialization.Formatters.Binary;
+    using nanoFramework.Benchmark;
+    using nanoFramework.Benchmark.Attributes;
+    using nanoFramework.Json;
+    using nanoFramework.MessagePack.Benchmark.Base;
+    using nanoFramework.MessagePack.Benchmark.Data;
+    using static nanoFramework.MessagePack.Benchmark.Data.ComparativeTestObjects;
+
+    /// <summary>
+    /// Comparative deserialization benchmark.
+    /// </summary>
+    [IterationCount(10)]
+    public class ComparativeDeserializationBenchmark : BaseIterationBenchmark
+    {
+        /// <summary>
+        /// public iteration count.
+        /// </summary>
+        protected override int _iterationCount => 1;
+
+        /// <summary>
+        /// Deserialization json benchmark.
+        /// </summary>
+        [Benchmark]
+        public void JsonDeserializationBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                JsonConvert.DeserializeObject(TestJson, typeof(TestObjectClass), ComparativeTestObjects.JsonSerializerOptions);
+            });
+        }
+
+        /// <summary>
+        /// Deserialization <see cref="BinaryFormatter"/> binary array benchmark.
+        /// </summary>
+        [Benchmark]
+        public void BinaryDeserializationBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                BinaryFormatter.Deserialize(TestObjectBinaryBytes);
+            });
+        }
+
+        /// <summary>
+        /// Deserialization <see cref="MessagePack"/> binary array benchmark.
+        /// </summary>
+        [Benchmark]
+        public void MessagePackDeserializationBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(TestObjectClass), TestObjectMsgPackBytes);
+            });
+        }
+    }
+}
diff --git a/nanoFramework.MessagePack.Benchmark/DeserializationBenchmarks/ReferenceTypesDeserializationBenchmark.cs b/nanoFramework.MessagePack.Benchmark/DeserializationBenchmarks/ReferenceTypesDeserializationBenchmark.cs
new file mode 100644
index 0000000..01a6e64
--- /dev/null
+++ b/nanoFramework.MessagePack.Benchmark/DeserializationBenchmarks/ReferenceTypesDeserializationBenchmark.cs
@@ -0,0 +1,105 @@
+﻿// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace nanoFramework.MessagePack.Benchmark.DeserializationBenchmarks
+{
+    using System.Collections;
+    using nanoFramework.Benchmark;
+    using nanoFramework.Benchmark.Attributes;
+    using nanoFramework.MessagePack.Benchmark.Base;
+    using nanoFramework.MessagePack.Benchmark.Data;
+
+    /// <summary>
+    /// Reference types deserialization benchmark.
+    /// </summary>
+    [IterationCount(5)]
+    public class ReferenceTypesDeserializationBenchmark : BaseIterationBenchmark
+    {
+        /// <summary>
+        /// Bates int array for test.
+        /// </summary>
+        private byte[] intArrayBytes;
+
+        /// <summary>
+        /// Byte array for test.
+        /// </summary>
+        private byte[] byteArrayBytes;
+
+        /// <summary>
+        /// Bytes two-dimensional array for test.
+        /// </summary>
+        private byte[] twoDimensionalArrayBytes;
+
+        /// <summary>
+        /// Bytes hashtable array for test.
+        /// </summary>
+        private byte[] testHashtableBytes;
+
+        /// <summary>
+        /// public iteration count.
+        /// </summary>
+        protected override int _iterationCount => 20;
+
+        /// <summary>
+        /// Initialize all test data objects.
+        /// </summary>
+        [Setup]
+        public void Setup()
+        {
+            intArrayBytes = MessagePackSerializer.Serialize(ReferenceTestObjects.IntArray);
+            byteArrayBytes = MessagePackSerializer.Serialize(ReferenceTestObjects.ByteArray);
+            twoDimensionalArrayBytes = MessagePackSerializer.Serialize(ReferenceTestObjects.TwoDimensionalArray);
+            testHashtableBytes = MessagePackSerializer.Serialize(ReferenceTestObjects.TestHashtable);
+        }
+
+        /// <summary>
+        /// Deserialize int array benchmark
+        /// </summary>
+        [Benchmark]
+        public void IntArrayBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(int[]), intArrayBytes);
+            });
+        }
+
+        /// <summary>
+        /// Deserialize byte array benchmark
+        /// </summary>
+        [Benchmark]
+        public void ByteArrayBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(byte[]), byteArrayBytes);
+            });
+        }
+
+        /// <summary>
+        /// Deserialize two-dimensional array benchmark.
+        /// </summary>
+        [Benchmark]
+        public void TwoDimensionalArrayBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(long[][]), twoDimensionalArrayBytes);
+            });
+        }
+
+        /// <summary>
+        /// /// <summary>
+        /// Deserialize hashtable benchmark.
+        /// </summary>
+        /// </summary>
+        [Benchmark]
+        public void TestHashtableBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(Hashtable), testHashtableBytes);
+            });
+        }
+    }
+}
diff --git a/nanoFramework.MessagePack.Benchmark/DeserializationBenchmarks/ValueTypesDeserializationBenchmark.cs b/nanoFramework.MessagePack.Benchmark/DeserializationBenchmarks/ValueTypesDeserializationBenchmark.cs
new file mode 100644
index 0000000..b9446cf
--- /dev/null
+++ b/nanoFramework.MessagePack.Benchmark/DeserializationBenchmarks/ValueTypesDeserializationBenchmark.cs
@@ -0,0 +1,294 @@
+﻿// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace nanoFramework.MessagePack.Benchmark.DeserializationBenchmarks
+{
+    using System;
+    using nanoFramework.Benchmark;
+    using nanoFramework.Benchmark.Attributes;
+    using nanoFramework.MessagePack.Benchmark.Base;
+
+    /// <summary>
+    /// Value types deserialization benchmark.
+    /// </summary>
+    [IterationCount(5)]
+    public class ValueTypesDeserializationBenchmark : BaseIterationBenchmark
+    {
+        /// <summary>
+        /// Test bytes for <see cref="short"/>
+        /// </summary>
+        private readonly byte[] shortBytes = MessagePackSerializer.Serialize(short.MaxValue);
+
+        /// <summary>
+        /// Test bytes for <see cref="ushort"/>
+        /// </summary>
+        private readonly byte[] ushortBytes = MessagePackSerializer.Serialize(ushort.MaxValue);
+
+        /// <summary>
+        /// Test bytes for <see cref="int"/>
+        /// </summary>
+        private readonly byte[] intBytes = MessagePackSerializer.Serialize(int.MaxValue);
+
+        /// <summary>
+        /// Test bytes for <see cref="uint"/>
+        /// </summary>
+        private readonly byte[] uintBytes = MessagePackSerializer.Serialize(uint.MaxValue);
+
+        /// <summary>
+        /// Test bytes for <see cref="long"/>
+        /// </summary>
+        private readonly byte[] longBytes = MessagePackSerializer.Serialize(long.MaxValue);
+
+        /// <summary>
+        /// Test bytes for <see cref="ulong"/>
+        /// </summary>
+        private readonly byte[] ulongBytes = MessagePackSerializer.Serialize(ulong.MaxValue);
+
+        /// <summary>
+        /// Test bytes for <see cref="byte"/>
+        /// </summary>
+        private readonly byte[] byteBytes = MessagePackSerializer.Serialize(byte.MaxValue);
+
+        /// <summary>
+        /// Test bytes for <see cref="sbyte"/>
+        /// </summary>
+        private readonly byte[] sbyteBytes = MessagePackSerializer.Serialize(sbyte.MaxValue);
+
+        /// <summary>
+        /// Test bytes for <see cref="float"/>
+        /// </summary>
+        private readonly byte[] floatBytes = MessagePackSerializer.Serialize(float.MaxValue);
+
+        /// <summary>
+        /// Test bytes for <see cref="double"/>
+        /// </summary>
+        private readonly byte[] doubleBytes = MessagePackSerializer.Serialize(double.MaxValue);
+
+        /// <summary>
+        /// Test bytes for <see cref="bool"/>
+        /// </summary>
+        private readonly byte[] boolBytes = MessagePackSerializer.Serialize(true);
+
+        /// <summary>
+        /// Test bytes for <see cref="char"/>
+        /// </summary>
+        private readonly byte[] charBytes = MessagePackSerializer.Serialize(char.MaxValue);
+
+        /// <summary>
+        /// Test bytes for <see cref="string"/>
+        /// </summary>
+        private readonly byte[] stringBytes = MessagePackSerializer.Serialize("Benchmark test");
+
+        /// <summary>
+        /// Test bytes for <see cref="DateTime"/>
+        /// </summary>
+        private readonly byte[] dateTimeBytes = MessagePackSerializer.Serialize(DateTime.UtcNow);
+
+        /// <summary>
+        /// Test bytes for <see cref="TimeSpan"/>
+        /// </summary>
+        private readonly byte[] timeSpanBytes = MessagePackSerializer.Serialize(TimeSpan.MaxValue);
+
+        /// <summary>
+        /// Test bytes for <see cref="Guid"/>
+        /// </summary>
+        private readonly byte[] guidBytes = MessagePackSerializer.Serialize(Guid.NewGuid());
+
+        /// <summary>
+        /// public iteration count.
+        /// </summary>
+        protected override int _iterationCount => 20;
+
+        /// <summary>
+        /// Deserialization <see cref="Guid"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void GuidBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(Guid), guidBytes);
+            });
+        }
+
+        /// <summary>
+        /// Deserialization <see cref="short"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void ShortBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(short), shortBytes);
+            });
+        }
+
+        /// <summary>
+        /// Deserialization <see cref="ushort"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void UshortBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(ushort), ushortBytes);
+            });
+        }
+
+        /// <summary>
+        /// Deserialization <see cref="int"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void IntBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(int), intBytes);
+            });
+        }
+
+        /// <summary>
+        /// Deserialization <see cref="uint"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void UintBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(uint), uintBytes);
+            });
+        }
+
+        /// <summary>
+        /// Deserialization <see cref="sbyte"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void SbyteBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(sbyte), sbyteBytes);
+            });
+        }
+
+        /// <summary>
+        /// Deserialization <see cref="byte"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void ByteBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(byte), byteBytes);
+            });
+        }
+
+        /// <summary>
+        /// Deserialization <see cref="bool"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void BoolBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(bool), boolBytes);
+            });
+        }
+
+        /// <summary>
+        /// Deserialization <see cref="char"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void CharBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(char), charBytes);
+            });
+        }
+
+        /// <summary>
+        /// Deserialization <see cref="string"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void StringBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(string), stringBytes);
+            });
+        }
+
+        /// <summary>
+        /// Deserialization <see cref="TimeSpan"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void TimeSpanBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(TimeSpan), timeSpanBytes);
+            });
+        }
+
+        /// <summary>
+        /// Deserialization <see cref="float"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void FloatBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(float), floatBytes);
+            });
+        }
+
+        /// <summary>
+        /// Deserialization <see cref="double"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void DoubleBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(double), doubleBytes);
+            });
+        }
+
+        /// <summary>
+        /// Deserialization <see cref="DateTime"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void DateTimeBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(DateTime), dateTimeBytes);
+            });
+        }
+
+        /// <summary>
+        /// Deserialization <see cref="long"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void LongBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(long), longBytes);
+            });
+        }
+
+        /// <summary>
+        /// Deserialization <see cref="ulong"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void UlongBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Deserialize(typeof(ulong), ulongBytes);
+            });
+        }
+    }
+}
diff --git a/nanoFramework.MessagePack.Benchmark/Program.cs b/nanoFramework.MessagePack.Benchmark/Program.cs
new file mode 100644
index 0000000..18ad505
--- /dev/null
+++ b/nanoFramework.MessagePack.Benchmark/Program.cs
@@ -0,0 +1,49 @@
+﻿// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace nanoFramework.MessagePack.Benchmark
+{
+    using System;
+    using System.Threading;
+    using nanoFramework.Benchmark;
+    using nanoFramework.Json;
+    using nanoFramework.MessagePack.Benchmark.Data;
+    using nanoFramework.MessagePack.Benchmark.DeserializationBenchmarks;
+    using nanoFramework.MessagePack.Benchmark.SerializationBenchmarks;
+
+    /// <summary>
+    /// Main program
+    /// </summary>
+    internal class Program
+    {
+        /// <summary>
+        /// Enter point for run all benchmarks
+        /// </summary>
+        internal static void Main()
+        {
+            Console.WriteLine("********** Starting benchmarks **********");
+            BenchmarkRunner.RunClass(typeof(ReferenceTypesDeserializationBenchmark));
+            BenchmarkRunner.RunClass(typeof(ValueTypesDeserializationBenchmark));
+            BenchmarkRunner.RunClass(typeof(ReferenceTypesSerializationBenchmark));
+            BenchmarkRunner.RunClass(typeof(ValueTypesSerializationBenchmark));
+
+            var testData = new ComparativeTestObjects();
+            Console.WriteLine();
+            Console.WriteLine();
+            Console.WriteLine("===============================================================");
+            Console.WriteLine("==========         Comparative benchmarks data       ==========");
+            Console.WriteLine("==========                                           ==========");
+            Console.WriteLine($"========== Json string size:           {JsonConvert.SerializeObject(ComparativeTestObjects.TestObject).Length} bytes    ==========");
+            Console.WriteLine($"========== BinaryFormatter array size: {ComparativeTestObjects.TestObjectBinaryBytes.Length} bytes    ==========");
+            Console.WriteLine($"========== MessagePack array size:     {ComparativeTestObjects.TestObjectMsgPackBytes.Length} bytes    ==========");
+            Console.WriteLine("==========                                           ==========");
+            Console.WriteLine("===============================================================");
+
+            BenchmarkRunner.RunClass(typeof(ComparativeDeserializationBenchmark));
+            BenchmarkRunner.RunClass(typeof(ComparativeSerializationBenchmark));
+            Console.WriteLine("********** Completed benchmarks **********");
+
+            Thread.Sleep(Timeout.Infinite);
+        }
+    }
+}
diff --git a/nanoFramework.MessagePack.Benchmark/Properties/AssemblyInfo.cs b/nanoFramework.MessagePack.Benchmark/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..b6ea4a1
--- /dev/null
+++ b/nanoFramework.MessagePack.Benchmark/Properties/AssemblyInfo.cs
@@ -0,0 +1,35 @@
+﻿// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("CSharp.BlankApplication")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("CSharp.BlankApplication")]
+[assembly: AssemblyCopyright("Copyright ©  2025")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/nanoFramework.MessagePack.Benchmark/SerializationBenchmarks/ComparativeSerializationBenchmark.cs b/nanoFramework.MessagePack.Benchmark/SerializationBenchmarks/ComparativeSerializationBenchmark.cs
new file mode 100644
index 0000000..23e9ecf
--- /dev/null
+++ b/nanoFramework.MessagePack.Benchmark/SerializationBenchmarks/ComparativeSerializationBenchmark.cs
@@ -0,0 +1,60 @@
+﻿// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace nanoFramework.MessagePack.Benchmark.SerializationBenchmarks
+{
+    using System.Runtime.Serialization.Formatters.Binary;
+    using nanoFramework.Benchmark;
+    using nanoFramework.Benchmark.Attributes;
+    using nanoFramework.Json;
+    using nanoFramework.MessagePack.Benchmark.Base;
+    using nanoFramework.MessagePack.Benchmark.Data;
+
+    /// <summary>
+    /// Comparative serialization benchmark.
+    /// </summary>
+    [IterationCount(10)]
+    public class ComparativeSerializationBenchmark : BaseIterationBenchmark
+    {
+        /// <summary>
+        /// public iteration count.
+        /// </summary>
+        protected override int _iterationCount => 1;
+
+        /// <summary>
+        /// Serialization json text <see cref="ComparativeTestObjects.TestObject"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void JsonSerializationBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                JsonConvert.SerializeObject(ComparativeTestObjects.TestObject);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="BinaryFormatter"/> test <see cref="ComparativeTestObjects.TestObject"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void BinarySerializationBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                BinaryFormatter.Serialize(ComparativeTestObjects.TestObject);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="MessagePack"/> test <see cref="ComparativeTestObjects.TestObject"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void MessagePackSerializationBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(ComparativeTestObjects.TestObject);
+            });
+        }
+    }
+}
diff --git a/nanoFramework.MessagePack.Benchmark/SerializationBenchmarks/ReferenceTypesSerializationBenchmark.cs b/nanoFramework.MessagePack.Benchmark/SerializationBenchmarks/ReferenceTypesSerializationBenchmark.cs
new file mode 100644
index 0000000..48f9441
--- /dev/null
+++ b/nanoFramework.MessagePack.Benchmark/SerializationBenchmarks/ReferenceTypesSerializationBenchmark.cs
@@ -0,0 +1,70 @@
+﻿// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace nanoFramework.MessagePack.Benchmark.SerializationBenchmarks
+{
+    using nanoFramework.Benchmark;
+    using nanoFramework.Benchmark.Attributes;
+    using nanoFramework.MessagePack.Benchmark.Base;
+    using nanoFramework.MessagePack.Benchmark.Data;
+
+    /// <summary>
+    /// Reference types serialization benchmark.
+    /// </summary>
+    [IterationCount(5)]
+    public class ReferenceTypesSerializationBenchmark : BaseIterationBenchmark
+    {
+        /// <summary>
+        /// public iteration count.
+        /// </summary>
+        protected override int _iterationCount => 20;
+
+        /// <summary>
+        /// Serialization <see cref="ReferenceTestObjects.IntArray"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void IntArrayBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(ReferenceTestObjects.IntArray);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="ReferenceTestObjects.ByteArray"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void ByteArrayBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(ReferenceTestObjects.ByteArray);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="ReferenceTestObjects.TwoDimensionalArray"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void TwoDimensionalArrayBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(ReferenceTestObjects.TwoDimensionalArray);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="ReferenceTestObjects.TestHashtable"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void TestHashtableBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(ReferenceTestObjects.TestHashtable);
+            });
+        }
+    }
+}
diff --git a/nanoFramework.MessagePack.Benchmark/SerializationBenchmarks/ValueTypesSerializationBenchmark.cs b/nanoFramework.MessagePack.Benchmark/SerializationBenchmarks/ValueTypesSerializationBenchmark.cs
new file mode 100644
index 0000000..b5b1f39
--- /dev/null
+++ b/nanoFramework.MessagePack.Benchmark/SerializationBenchmarks/ValueTypesSerializationBenchmark.cs
@@ -0,0 +1,229 @@
+﻿// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace nanoFramework.MessagePack.Benchmark.SerializationBenchmarks
+{
+    using System;
+    using nanoFramework.Benchmark;
+    using nanoFramework.Benchmark.Attributes;
+    using nanoFramework.MessagePack.Benchmark.Base;
+
+    /// <summary>
+    /// Value types serialization benchmark
+    /// </summary>
+    [IterationCount(5)]
+    public class ValueTypesSerializationBenchmark : BaseIterationBenchmark
+    {
+        /// <summary>
+        /// Test <see cref="Guid"/>
+        /// </summary>
+        private readonly Guid _testGuid = Guid.NewGuid();
+
+        /// <summary>
+        /// Test <see cref="DateTime"/>
+        /// </summary>
+        private readonly DateTime _testDateTime = DateTime.UtcNow;
+
+        /// <summary>
+        /// Test <see cref="string"/>
+        /// </summary>
+        private readonly string _testString = "Benchmark test";
+
+        /// <summary>
+        /// public iteration count.
+        /// </summary>
+        protected override int _iterationCount => 20;
+
+        /// <summary>
+        /// Serialization <see cref="Guid"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void GuidBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(_testGuid);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="short"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void ShortBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(short.MaxValue);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="ushort"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void UshortBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(ushort.MaxValue);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="int"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void IntBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(int.MaxValue);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="uint"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void UintBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(uint.MaxValue);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="sbyte"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void SbyteBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(sbyte.MaxValue);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="byte"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void ByteBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(byte.MaxValue);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="bool"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void BoolBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(true);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="char"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void CharBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(char.MaxValue);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="string"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void StringBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(_testString);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="TimeSpan"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void TimeSpanBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(TimeSpan.MaxValue);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="float"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void FloatBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(float.MaxValue);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="double"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void DoubleBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(double.MaxValue);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="DateTime"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void DateTimeBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(_testDateTime);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="long"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void LongBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(long.MaxValue);
+            });
+        }
+
+        /// <summary>
+        /// Serialization <see cref="ulong"/> benchmark.
+        /// </summary>
+        [Benchmark]
+        public void UlongBenchmark()
+        {
+            RunInIteration(() =>
+            {
+                MessagePackSerializer.Serialize(ulong.MaxValue);
+            });
+        }
+    }
+}
diff --git a/nanoFramework.MessagePack.Benchmark/nanoFramework.MessagePack.Benchmark.nfproj b/nanoFramework.MessagePack.Benchmark/nanoFramework.MessagePack.Benchmark.nfproj
new file mode 100644
index 0000000..1afdc8d
--- /dev/null
+++ b/nanoFramework.MessagePack.Benchmark/nanoFramework.MessagePack.Benchmark.nfproj
@@ -0,0 +1,89 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="Current" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Label="Globals">
+    <NanoFrameworkProjectSystemPath>$(MSBuildExtensionsPath)\nanoFramework\v1.0\</NanoFrameworkProjectSystemPath>
+  </PropertyGroup>
+  <Import Project="$(NanoFrameworkProjectSystemPath)NFProjectSystem.Default.props" Condition="Exists('$(NanoFrameworkProjectSystemPath)NFProjectSystem.Default.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectTypeGuids>{11A8DD76-328B-46DF-9F39-F559912D0360};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <ProjectGuid>d2fe3c40-b913-40ab-b84b-e3fc3ceb4104</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <FileAlignment>512</FileAlignment>
+    <RootNamespace>nanoFramework.MessagePack.Benchmark</RootNamespace>
+    <AssemblyName>nanoFramework.MessagePack.Benchmark</AssemblyName>
+    <TargetFrameworkVersion>v1.0</TargetFrameworkVersion>
+    <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
+    <RestoreLockedMode Condition="'$(TF_BUILD)' == 'True' or '$(ContinuousIntegrationBuild)' == 'True'">true</RestoreLockedMode>
+  </PropertyGroup>
+  <Import Project="$(NanoFrameworkProjectSystemPath)NFProjectSystem.props" Condition="Exists('$(NanoFrameworkProjectSystemPath)NFProjectSystem.props')" />
+  <ItemGroup>
+    <Compile Include="Base\BaseIterationBenchmark.cs" />
+    <Compile Include="Data\ComparativeTestObjects.cs" />
+    <Compile Include="Data\ReferenceTestObjects.cs" />
+    <Compile Include="DeserializationBenchmarks\ComparativeDeserializationBenchmark.cs" />
+    <Compile Include="DeserializationBenchmarks\ReferenceTypesDeserializationBenchmark.cs" />
+    <Compile Include="DeserializationBenchmarks\ValueTypesDeserializationBenchmark.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="SerializationBenchmarks\ComparativeSerializationBenchmark.cs" />
+    <Compile Include="SerializationBenchmarks\ReferenceTypesSerializationBenchmark.cs" />
+    <Compile Include="SerializationBenchmarks\ValueTypesSerializationBenchmark.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="mscorlib, Version=1.17.11.0, Culture=neutral, PublicKeyToken=c07d481e9758c731">
+      <HintPath>..\packages\nanoFramework.CoreLibrary.1.17.11\lib\mscorlib.dll</HintPath>
+    </Reference>
+    <Reference Include="nanoFramework.Benchmark, Version=1.0.108.0, Culture=neutral, PublicKeyToken=c07d481e9758c731">
+      <HintPath>..\packages\nanoFramework.Benchmark.1.0.108\lib\nanoFramework.Benchmark.dll</HintPath>
+    </Reference>
+    <Reference Include="nanoFramework.Json">
+      <HintPath>..\packages\nanoFramework.Json.2.2.199\lib\nanoFramework.Json.dll</HintPath>
+    </Reference>
+    <Reference Include="nanoFramework.Logging, Version=1.1.156.0, Culture=neutral, PublicKeyToken=c07d481e9758c731">
+      <HintPath>..\packages\nanoFramework.Logging.1.1.156\lib\nanoFramework.Logging.dll</HintPath>
+    </Reference>
+    <Reference Include="nanoFramework.Runtime.Native, Version=1.7.11.0, Culture=neutral, PublicKeyToken=c07d481e9758c731">
+      <HintPath>..\packages\nanoFramework.Runtime.Native.1.7.11\lib\nanoFramework.Runtime.Native.dll</HintPath>
+    </Reference>
+    <Reference Include="nanoFramework.System.Collections, Version=1.5.67.0, Culture=neutral, PublicKeyToken=c07d481e9758c731">
+      <HintPath>..\packages\nanoFramework.System.Collections.1.5.67\lib\nanoFramework.System.Collections.dll</HintPath>
+    </Reference>
+    <Reference Include="nanoFramework.System.Text, Version=1.3.42.0, Culture=neutral, PublicKeyToken=c07d481e9758c731">
+      <HintPath>..\packages\nanoFramework.System.Text.1.3.42\lib\nanoFramework.System.Text.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Diagnostics.Stopwatch, Version=1.2.0.0, Culture=neutral, PublicKeyToken=c07d481e9758c731">
+      <HintPath>..\packages\nanoFramework.System.Diagnostics.Stopwatch.1.2.862\lib\System.Diagnostics.Stopwatch.dll</HintPath>
+    </Reference>
+    <Reference Include="System.IO.Streams">
+      <HintPath>..\packages\nanoFramework.System.IO.Streams.1.1.96\lib\System.IO.Streams.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Runtime.Serialization, Version=1.0.57.0, Culture=neutral, PublicKeyToken=c07d481e9758c731">
+      <HintPath>..\packages\nanoFramework.System.Runtime.Serialization.1.0.57\lib\System.Runtime.Serialization.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\nanoFramework.MessagePack\nanoFramework.MessagePack.nfproj" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="packages.lock.json" />
+  </ItemGroup>
+  <Import Project="$(NanoFrameworkProjectSystemPath)NFProjectSystem.CSharp.targets" Condition="Exists('$(NanoFrameworkProjectSystemPath)NFProjectSystem.CSharp.targets')" />
+  <Import Project="..\packages\StyleCop.MSBuild.6.2.0\build\StyleCop.MSBuild.targets" Condition="Exists('..\packages\StyleCop.MSBuild.6.2.0\build\StyleCop.MSBuild.targets')" />
+  <ProjectExtensions>
+    <ProjectCapabilities>
+      <ProjectConfigurationsDeclaredAsItems />
+    </ProjectCapabilities>
+  </ProjectExtensions>
+  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+    <PropertyGroup>
+      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105.The missing file is {0}.</ErrorText>
+    </PropertyGroup>
+    <Error Condition="!Exists('..\packages\StyleCop.MSBuild.6.2.0\build\StyleCop.MSBuild.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\StyleCop.MSBuild.6.2.0\build\StyleCop.MSBuild.targets'))" />
+  </Target>
+</Project>
\ No newline at end of file
diff --git a/nanoFramework.MessagePack.Benchmark/packages.config b/nanoFramework.MessagePack.Benchmark/packages.config
new file mode 100644
index 0000000..813dc74
--- /dev/null
+++ b/nanoFramework.MessagePack.Benchmark/packages.config
@@ -0,0 +1,14 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="nanoFramework.Benchmark" version="1.0.108" targetFramework="netnano1.0" />
+  <package id="nanoFramework.CoreLibrary" version="1.17.11" targetFramework="netnano1.0" />
+  <package id="nanoFramework.Json" version="2.2.199" targetFramework="netnano1.0" />
+  <package id="nanoFramework.Logging" version="1.1.156" targetFramework="netnano1.0" />
+  <package id="nanoFramework.Runtime.Native" version="1.7.11" targetFramework="netnano1.0" />
+  <package id="nanoFramework.System.Collections" version="1.5.67" targetFramework="netnano1.0" />
+  <package id="nanoFramework.System.Diagnostics.Stopwatch" version="1.2.862" targetFramework="netnano1.0" />
+  <package id="nanoFramework.System.IO.Streams" version="1.1.96" targetFramework="netnano1.0" />
+  <package id="nanoFramework.System.Runtime.Serialization" version="1.0.57" targetFramework="netnano1.0" />
+  <package id="nanoFramework.System.Text" version="1.3.42" targetFramework="netnano1.0" />
+  <package id="StyleCop.MSBuild" version="6.2.0" targetFramework="netnano1.0" developmentDependency="true" />
+</packages>
\ No newline at end of file
diff --git a/nanoFramework.MessagePack.Benchmark/packages.lock.json b/nanoFramework.MessagePack.Benchmark/packages.lock.json
new file mode 100644
index 0000000..1eca2dc
--- /dev/null
+++ b/nanoFramework.MessagePack.Benchmark/packages.lock.json
@@ -0,0 +1,73 @@
+{
+  "version": 1,
+  "dependencies": {
+    ".NETnanoFramework,Version=v1.0": {
+      "nanoFramework.Benchmark": {
+        "type": "Direct",
+        "requested": "[1.0.108, 1.0.108]",
+        "resolved": "1.0.108",
+        "contentHash": "sB8s1NqIpiOwEv3dECt8rQDcgyEhhM6wDVhj41b0znrZ7sklBI8HlSMOpPmidscJMlxyAcO8lQ3j5FTi3JPgMQ=="
+      },
+      "nanoFramework.CoreLibrary": {
+        "type": "Direct",
+        "requested": "[1.17.11, 1.17.11]",
+        "resolved": "1.17.11",
+        "contentHash": "HezzAc0o2XrSGf85xSeD/6xsO6ohF9hX6/iMQ1IZS6Zw6umr4WfAN2Jv0BrPxkaYwzEegJxxZujkHoUIAqtOMw=="
+      },
+      "nanoFramework.Json": {
+        "type": "Direct",
+        "requested": "[2.2.199, 2.2.199]",
+        "resolved": "2.2.199",
+        "contentHash": "XBNKcI5hiUpn19NxhSYM4cxH0FXeefrohGD4tFrTlwhZw3hL1ie5UQJ0dPsaUBb/YkypkJZzQoxEvnwOj8DI5w=="
+      },
+      "nanoFramework.Logging": {
+        "type": "Direct",
+        "requested": "[1.1.156, 1.1.156]",
+        "resolved": "1.1.156",
+        "contentHash": "88QonPIXQnfNqs7lPGyS1r+upesv5O8EhwYOHhYGv247ah0pnL2vBKDbR4lRvB2aFOij7ZrbgiuaseKWy4vH/Q=="
+      },
+      "nanoFramework.Runtime.Native": {
+        "type": "Direct",
+        "requested": "[1.7.11, 1.7.11]",
+        "resolved": "1.7.11",
+        "contentHash": "XPSTltZ9KeBruogVmjQpCphi1nLoJH49mpyp2eGBs8BTjKuL5TkMO20MoI8r73F/PW5AppTq49HvIZZavU5nPQ=="
+      },
+      "nanoFramework.System.Collections": {
+        "type": "Direct",
+        "requested": "[1.5.67, 1.5.67]",
+        "resolved": "1.5.67",
+        "contentHash": "MjSipUB70vrxjqTm1KfKTUqqjd0wbweiNyYFXONi0XClrH6HXsuX2lhDqXM8NWuYnWyYOqx8y20sXbvsH+4brg=="
+      },
+      "nanoFramework.System.Diagnostics.Stopwatch": {
+        "type": "Direct",
+        "requested": "[1.2.862, 1.2.862]",
+        "resolved": "1.2.862",
+        "contentHash": "auNXXoJYOJ7mAxPvMPhbxFbDCtfKF/wSdsoBEQiRd8NaQWmLg12JL6YbNiKiNs+fBlxAL6duUorBdhSyPCdayg=="
+      },
+      "nanoFramework.System.IO.Streams": {
+        "type": "Direct",
+        "requested": "[1.1.96, 1.1.96]",
+        "resolved": "1.1.96",
+        "contentHash": "kJSy4EJwChO4Vq3vGWP9gNRPFDnTsDU5HxzeI7NDO+RjbDsx7B8EhKymoeTPLJCxQq8y/0P1KG2XCxGpggW+fw=="
+      },
+      "nanoFramework.System.Runtime.Serialization": {
+        "type": "Direct",
+        "requested": "[1.0.57, 1.0.57]",
+        "resolved": "1.0.57",
+        "contentHash": "pSZ1L6UES3GX+Z7Drq8zzmEwvNugRQUo8801iyS6HiFWAV5miKv0zubf6j/eIbJvTsFDiqbfwKtndpqlVDuTZQ=="
+      },
+      "nanoFramework.System.Text": {
+        "type": "Direct",
+        "requested": "[1.3.42, 1.3.42]",
+        "resolved": "1.3.42",
+        "contentHash": "68HPjhersNpssbmEMUHdMw3073MHfGTfrkbRk9eILKbNPFfPFck7m4y9BlAi6DaguUJaeKxgyIojXF3SQrF8/A=="
+      },
+      "StyleCop.MSBuild": {
+        "type": "Direct",
+        "requested": "[6.2.0, 6.2.0]",
+        "resolved": "6.2.0",
+        "contentHash": "6J51Kt5X+Os+Ckp20SFP1SlLu3tZl+3qBhCMtJUJqGDgwSr4oHT+eg545hXCdp07tRB/8nZfXTOBDdA1XXvjUw=="
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/nanoFramework.MessagePack.sln b/nanoFramework.MessagePack.sln
index cdf9bab..8fdc6b4 100644
--- a/nanoFramework.MessagePack.sln
+++ b/nanoFramework.MessagePack.sln
@@ -23,6 +23,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
 		version.json = version.json
 	EndProjectSection
 EndProject
+Project("{11A8DD76-328B-46DF-9F39-F559912D0360}") = "nanoFramework.MessagePack.Benchmark", "nanoFramework.MessagePack.Benchmark\nanoFramework.MessagePack.Benchmark.nfproj", "{D2FE3C40-B913-40AB-B84B-E3FC3CEB4104}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -49,6 +51,12 @@ Global
 		{C14AC887-183A-421D-B047-AA3E1E6A066C}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{C14AC887-183A-421D-B047-AA3E1E6A066C}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{C14AC887-183A-421D-B047-AA3E1E6A066C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D2FE3C40-B913-40AB-B84B-E3FC3CEB4104}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D2FE3C40-B913-40AB-B84B-E3FC3CEB4104}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D2FE3C40-B913-40AB-B84B-E3FC3CEB4104}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+		{D2FE3C40-B913-40AB-B84B-E3FC3CEB4104}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D2FE3C40-B913-40AB-B84B-E3FC3CEB4104}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D2FE3C40-B913-40AB-B84B-E3FC3CEB4104}.Release|Any CPU.Deploy.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE


Reviews:
user: login: josesimoes
body: All good, just some issues with code style and a tweak in the readme.
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-22T21:07:37Z
user: login: RelaxSpirit
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-23T06:27:42Z
user: login: josesimoes
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-23T09:11:42Z
user: login: josesimoes
body: LGTM! 
I've fixed some left nits.
Thanks for adding the benchmark project. 
Now we have a completely documented alternative library!
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-23T14:28:07Z

Review comments:
diff_hunk: @@ -0,0 +1,46 @@
+﻿// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Runtime.Serialization.Formatters.Binary;
+using System.Text;
+using nanoFramework.Benchmark;
+using nanoFramework.Benchmark.Attributes;
+using nanoFramework.Json;
+using nanoFramework.MessagePack.Benchmark.Base;
+using nanoFramework.MessagePack.Benchmark.Data;
+
+namespace nanoFramework.MessagePack.Benchmark.DeserializationBenchmarks
+{
+    [IterationCount(10)]
+    internal class ComparativeDeserializationBenchmark : BaseIterationBenchmark
+    {
+        protected override int IterationCount => 1;
path: nanoFramework.MessagePack.Benchmark/DeserializationBenchmarks/ComparativeDeserializationBenchmark.cs
user: login: josesimoes
body: The project style calls for this pattern for private fields:
```suggestion
        protected override int _iterationCount => 1;
```

If you add a ref to the StyleCop nuget (see the library project) Visual Studio takes care of this for your and lets you know when something is wrong. 
created_at: 2025-04-22T19:30:24Z
author_association: MEMBER
diff_hunk: @@ -18,6 +18,42 @@ This repository contains the MessagePack library for the .NET **nanoFramework**.
 
 MessagePack is a simple, lightweight serialization library, inspired by [MsgPack.Light](https://github.com/progaudi/MsgPack.Light), that can be used in .NET[nanoFramework](https://github.com/nanoframework) solutions.
 
+# Approximate measurement results for different serializers
path: README.md
user: login: josesimoes
body: ```suggestion
## Benchmarks
```

And please move the section and place it after the "Usage" one. This is important when one is comparing serializer options, but secondary to the usage explanations.
created_at: 2025-04-22T21:03:48Z
author_association: MEMBER
diff_hunk: @@ -18,6 +18,42 @@ This repository contains the MessagePack library for the .NET **nanoFramework**.
 
 MessagePack is a simple, lightweight serialization library, inspired by [MsgPack.Light](https://github.com/progaudi/MsgPack.Light), that can be used in .NET[nanoFramework](https://github.com/nanoframework) solutions.
 
+# Approximate measurement results for different serializers
+
+The measurements were carried out on the developer's local computer in a virtual nanoDevice:
+
+ ```text
+===============================================================
+==========         Comparative benchmarks data       ==========
+==========                                           ==========
+========== Json string size:           5485 bytes    ==========
+========== BinaryFormatter array size: 1406 bytes    ==========
+========== MessagePack array size:     3174 bytes    ==========
+==========                                           ==========
+===============================================================
+
+Console export: ComparativeDeserializationBenchmark benchmark class.
+
+| ------------------------------------------------------------------------------ |
+| MethodName                          | IterationCount | Mean    | Min   | Max   |
+| ------------------------------------------------------------------------------ |
+| JsonDeserializationBenchmark        | 10             | 36.2 ms | 24 ms | 57 ms |
+| BinaryDeserializationBenchmark      | 10             | 0.2 ms  | 0 ms  | 1 ms  |
+| MessagePackDeserializationBenchmark | 10             | 27.7 ms | 24 ms | 44 ms |
+| ------------------------------------------------------------------------------ |
+
+Console export: ComparativeSerializationBenchmark benchmark class.
+
+| ---------------------------------------------------------------------------- |
+| MethodName                        | IterationCount | Mean    | Min   | Max   |
+| ---------------------------------------------------------------------------- |
+| JsonSerializationBenchmark        | 10             | 30.8 ms | 22 ms | 51 ms |
+| BinarySerializationBenchmark      | 10             | 0.2 ms  | 0 ms  | 1 ms  |
+| MessagePackSerializationBenchmark | 10             | 13.8 ms | 12 ms | 18 ms |
+| ---------------------------------------------------------------------------- |
+```
+In terms of speed, MessagePack is no worse than a Json serializer, and slightly wins in terms of the size of the serialized data
path: README.md
user: login: josesimoes
body: ```suggestion
As it can be seen from the benchmark results above, in what concerns speed and compaction, `MessagePack` performs better than the Json serializer. Comming at no surprise, Binary serialization is the most performant one.
```
created_at: 2025-04-22T21:06:34Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,46 @@
+﻿// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Runtime.Serialization.Formatters.Binary;
+using System.Text;
+using nanoFramework.Benchmark;
+using nanoFramework.Benchmark.Attributes;
+using nanoFramework.Json;
+using nanoFramework.MessagePack.Benchmark.Base;
+using nanoFramework.MessagePack.Benchmark.Data;
+
+namespace nanoFramework.MessagePack.Benchmark.DeserializationBenchmarks
+{
+    [IterationCount(10)]
+    internal class ComparativeDeserializationBenchmark : BaseIterationBenchmark
+    {
+        protected override int IterationCount => 1;
path: nanoFramework.MessagePack.Benchmark/DeserializationBenchmarks/ComparativeDeserializationBenchmark.cs
user: login: josesimoes
body: For reference, here is the code style guide:
https://docs.nanoframework.net/content/contributing/cs-coding-style.html
created_at: 2025-04-22T21:07:09Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,46 @@
+﻿// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Runtime.Serialization.Formatters.Binary;
+using System.Text;
+using nanoFramework.Benchmark;
+using nanoFramework.Benchmark.Attributes;
+using nanoFramework.Json;
+using nanoFramework.MessagePack.Benchmark.Base;
+using nanoFramework.MessagePack.Benchmark.Data;
+
+namespace nanoFramework.MessagePack.Benchmark.DeserializationBenchmarks
+{
+    [IterationCount(10)]
+    internal class ComparativeDeserializationBenchmark : BaseIterationBenchmark
+    {
+        protected override int IterationCount => 1;
path: nanoFramework.MessagePack.Benchmark/DeserializationBenchmarks/ComparativeDeserializationBenchmark.cs
user: login: RelaxSpirit
body: @josesimoes I'm sorry, all this has moved from a similar project, but for Json :)
I'll fix everything.
created_at: 2025-04-23T06:27:42Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,46 @@
+﻿// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Runtime.Serialization.Formatters.Binary;
+using System.Text;
+using nanoFramework.Benchmark;
+using nanoFramework.Benchmark.Attributes;
+using nanoFramework.Json;
+using nanoFramework.MessagePack.Benchmark.Base;
+using nanoFramework.MessagePack.Benchmark.Data;
+
+namespace nanoFramework.MessagePack.Benchmark.DeserializationBenchmarks
+{
+    [IterationCount(10)]
+    internal class ComparativeDeserializationBenchmark : BaseIterationBenchmark
+    {
+        protected override int IterationCount => 1;
path: nanoFramework.MessagePack.Benchmark/DeserializationBenchmarks/ComparativeDeserializationBenchmark.cs
user: login: josesimoes
body: No worries, nothing to apologise. You're doing a great work bringing MessagePack to the nanoFramework community.
We have a high bar on code quality. These are tiny nits that need to be addressed in order to maintain that level.
created_at: 2025-04-23T09:11:41Z
author_association: MEMBER

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-04-22T18:18:24Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough

A new `packages.lock.json` file has been added to the `nanoFramework.MessagePack.Benchmark` project. This file records the resolved versions of all NuGet dependencies for the project targeting `.NETnanoFramework,Version=v1.0`. It locks direct dependencies such as `nanoFramework.Benchmark`, `nanoFramework.CoreLibrary`, `nanoFramework.Json`, and others to specific versions, ensuring consistent package resolution and reproducibility. No changes were made to any code or public interfaces.

## Changes

| File(s)                                                      | Change Summary                                                                                           |
|--------------------------------------------------------------|----------------------------------------------------------------------------------------------------------|
| nanoFramework.MessagePack.Benchmark/packages.lock.json        | Added a lock file specifying exact versions and hashes for all NuGet dependencies in the benchmark project. |

## Suggested labels

`Type: dependencies`

## Suggested reviewers

- RelaxSpirit

<!-- walkthrough_end -->


---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 8b76eec0c939844af95e30a9b33e7e9d471969bf and fa7221e347daed0bb21e7d1917a9b3cb99fe08f1.

</details>

<details>
<summary>⛔ Files ignored due to path filters (25)</summary>

* `NFUnitTest/NFUnitTest.nfproj` is excluded by none and included by none
* `NFUnitTest/Properties/AssemblyInfo.cs` is excluded by none and included by none
* `Shared/MessagePack/Converters/DoubleConverter.cs` is excluded by none and included by none
* `Shared/MessagePack/Dto/ArraySegment.cs` is excluded by none and included by none
* `Shared/MessagePack/MessagePackSerializer.cs` is excluded by none and included by none
* `Shared/MessagePack/Stream/BaseReader.cs` is excluded by none and included by none
* `Shared/MessagePack/Stream/ByteArrayReader.cs` is excluded by none and included by none
* `Shared/MessagePack/Stream/IMessagePackReader.cs` is excluded by none and included by none
* `Shared/MessagePack/Stream/MemoryStreamReader.cs` is excluded by none and included by none
* `Shared/MessagePack/Stream/MemoryStreamWriter.cs` is excluded by none and included by none
* `UnitTestShared/Helpers/TestsHelper.cs` is excluded by none and included by none
* `UnitTestShared/TestData/TestClass.cs` is excluded by none and included by none
* `UnitTestShared/TestData/TestSubClass.cs` is excluded by none and included by none
* `UnitTestShared/UnitTests.cs` is excluded by none and included by none
* `nanoFramework.MessagePack.Benchmark/Base/BaseIterationBenchmark.cs` is excluded by none and included by none
* `nanoFramework.MessagePack.Benchmark/Data/ComparativeTestObjects.cs` is excluded by none and included by none
* `nanoFramework.MessagePack.Benchmark/DeserializationBenchmarks/ComparativeDeserializationBenchmark.cs` is excluded by none and included by none
* `nanoFramework.MessagePack.Benchmark/DeserializationBenchmarks/ReferenceTypesDeserializationBenchmark.cs` is excluded by none and included by none
* `nanoFramework.MessagePack.Benchmark/DeserializationBenchmarks/ValueTypesDeserializationBenchmark.cs` is excluded by none and included by none
* `nanoFramework.MessagePack.Benchmark/Properties/AssemblyInfo.cs` is excluded by none and included by none
* `nanoFramework.MessagePack.Benchmark/SerializationBenchmarks/ComparativeSerializationBenchmark.cs` is excluded by none and included by none
* `nanoFramework.MessagePack.Benchmark/SerializationBenchmarks/ReferenceTypesSerializationBenchmark.cs` is excluded by none and included by none
* `nanoFramework.MessagePack.Benchmark/SerializationBenchmarks/ValueTypesSerializationBenchmark.cs` is excluded by none and included by none
* `nanoFramework.MessagePack.Benchmark/nanoFramework.MessagePack.Benchmark.nfproj` is excluded by none and included by none
* `nanoFramework.MessagePack.Benchmark/packages.config` is excluded by none and included by none

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `nanoFramework.MessagePack.Benchmark/packages.lock.json` (1 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* nanoFramework.MessagePack.Benchmark/packages.lock.json

</details>

</details>
<!-- internal state start -->


<!-- DwQgtGAEAqAWCWBnSTIEMB26CuAXA9mAOYCmGJATmriQCaQDG+Ats2bgFyQAOFk+AIwBWJBrngA3EsgEBPRvlqU0AgfFwA6NPEgQAfACgjoCEYDEZyAAUASpETZWaCrKNxU3bABsvkCiQBHbGlcABpIcVwvOkgAIgBBWiV6ATIGWGZnAGtkXnwRMVDYyAB3NGQHAWZ1GhT5XFgSSGxESkgbEi80AA8AZW54CnV0ZFtIDEdUvgA2FCwGpoxMfAAxKjYS/AosjQBZaUQ0Uis0Biy/Em58RHUt2Q0YRshM+Cx0zFI53ApFbAYY1ALdBJdTwfBYfAAM3QkFSGHSmW2PB+BVwEXwyPwEngSkg2IcaF8cIR2QuDi8uEQD3iXnBRBuuIaSHCQJsAFF4gARXZsyCQ+DRUrlZrcWjUGIEPnwbr2NDMbiCpi4zD0eDyn5SCJPYkZUlKRAMIbccTgjRuJ7MfDiCTUMFYVIIDD0JmjOyAjFkFSC/HYQmwtK67avIjoJ3oyBZEiXLVNWj4BiOdi28Ei8NimgPOBNHWInKlShNGiIWrNG4YENoPGDXC+3xLDD4TkkbH/SBkbE/DBsDCac2F2TcaT8aHvctD14MLzYZLofwKDD8ojYKgmrAq2HYAX0RCyYskZgi9PScLruMJ7u4ZNYNV5KQXqmPAuzxYYgT+NBZYOMWAfY8bkP8t0f5bOMJAlHyJDUMu449j8tB/AC8xPIg+DLq2SokJmTxMLB8ACHgIE4fyFBsPQaC0I0/jwoWGJAnkqIAOTIBh9i4LI0ThNgorivQZ6Jj2V7oAwTAULQwZeLIJ5hkWJaEr4o6kMgtIMHJ8glOosA8OUZYhjJD4AHIYuQ4HYBgwx6fmc7kTOwrcM4aJQlqqC2GaBgWJAADCLD3vYjiIq4BhZvwGASQorDsMgKYujw3i+P4QQhM+fI/AeQItG0QjXNIar4NIWFNMRxZhReKDIJWTBONJtFDEQpB8EC8QAF7QdY8CDl4rxDjh4gTKhyCvDQRArnamL/IgyDqQ0cQAPRNdBVhtZ0nXIBQpkaMUQWtDh9AVSVqDld566SlxR6QEog5Omk8BDtilZAgIVqlBpcQAAILg9aInTxlxkEo8LXVSG2UU0zgvnyy4LHwYkGi0Nzgog4T+NiYEI/wfCQlGtACKc5y3jiiExsVEV8iB0UuUY+jGOAUC/cOOAEMQZDKCWu3sFwvD8MIojWkOcgKEoVCqOoWg6JTJhQO4/VlWuBGM+QK4xKzPZcFQ4EOE4LiwvIGGC2omjaLoYCGFTpgGPWqzrGBWw7Ps41HCQJxnBoABCAa5tNdlnPbVLKTsQgoRgHAGLEIduZY8QAJJy8zMTq/5dMKdIRjxKB4EAAae1k3saL7Gj++CadSoKZRlUkMSQqTTxp+baxylb2x7Ac9uOzsrvwoGWSF/R3NYag/KCogg4MPA/JDkCJDdKcaJSBQcMYNL9D+ChXhSLxP2Xf9Q4V/VTzd2IETOKQPUhmnGj6Wy0A15bmzbKEABqlBzwAvBIACMGgAAyn5AEdoh1xbIGYN4cQCpYyDG5mddef1h5DkmppBYgwLgJT3PQGec8/C/iUvGSMzoMSD1ECPeADA8SPztKjCcU4xLlkgNXZYtcNjWxdm7bIhcAAU78P4aFfh/AAHAASnCLQhs9D647C8v4AAMnhKgLg2Hv1fgAdi4a/ARNCr51xvjsAAUgHNhAAmDQBjX4AE5jGqKERbDRjCJH4FqsGORXCuEAFZpjmPUQwhuNhTLiDYGfW0UgHFKNfiowR7jREaF6LuGgzANBeR8NzMhDinEaGmAotxdDr6MMiXuGJnJ4BHAbMWIhVJegEG4GUXA6QHEGJ4dMPR6ThGZIbtk6JGgI4AHkInfEgswRADj37GNcaEjJVjmlRP3BoLxPY1SYV6JQfJHVGpXgcZwpxaThmNNGTsFpEzoAT1wA4gAzBoAALPUqS9A06lPYiQLy3A9i9GdpuLwtA2HTEMZ/PhDw2SnE0udX6aR5DsE1hQ6cQ4Do9nYJAH8iB4Eenni1AaJAhrqHkOufweR4LDzUB1NidM6I43tmSfAU5Vz5SLgVLYmRp6kJTKgVoaJJTvyMOYcOFJmZkPDECJQk5nBXkitCCeVwKAlhAp4AQHViHsFBEnAwhlyC92Yj+McwVQrWTKqnSAvsKUkz4JnIl/yN4wIXmdXKyAGxoktGJSEaKMBAu6MK0VersASqIfzJo0rxB5WDqHAwlMDDizbGGRyaBZakHljxImysMFqz8s4eQfMdYqD1iLQ2hhA27XUAAfRxIgLNSNrolDoFm4s9k00mygIcyEeiP60AYHohRTiP7BNfnoqtxi9EMEObwhgxieGv2mCckgCjX4nNSSOkgkJIQf3LYGupPCTm9oUZCWgr9p1oCcQwOpqgTk8OMScwZH9yKbtSa2/4hyVLQjFtTSAPCBAKOmFGBgH9e2HL7Sck5aBITGKcSQbtaBjECEOYc4dJBjG0BOSOwZgGr1GwDTeyEaAFF6L0a/P9kGxR0A/qoVDw7V3GMUQBoDDABCmIxrwyEr9y3wYgMVbNub83NkLcW2m+ggA=== -->

<!-- internal state end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=nanoframework/nanoFramework.MessagePack&utm_content=6):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: NONE
user: login: josesimoes
created_at: 2025-04-22T18:29:40Z
body: /AzurePipelines run
author_association: MEMBER
user: login: azure-pipelines[bot]
created_at: 2025-04-22T18:29:55Z
body: <samp>
Azure Pipelines successfully started running 1 pipeline(s).<br>

</samp>
author_association: NONE
user: login: josesimoes
created_at: 2025-04-23T13:05:27Z
body: @nfbot updatedependencies
author_association: MEMBER
user: login: josesimoes
created_at: 2025-04-23T14:28:25Z
body: /AzurePipelines run
author_association: MEMBER
user: login: azure-pipelines[bot]
created_at: 2025-04-23T14:28:41Z
body: <samp>
Azure Pipelines successfully started running 1 pipeline(s).<br>

</samp>
author_association: NONE
user: login: sonarqubecloud[bot]
created_at: 2025-04-23T14:35:15Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=nanoframework_nanoFramework.MessagePack&pullRequest=6) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed.svg '') [3 New issues](https://sonarcloud.io/project/issues?id=nanoframework_nanoFramework.MessagePack&pullRequest=6&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted.svg '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=nanoframework_nanoFramework.MessagePack&pullRequest=6&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed.svg '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=nanoframework_nanoFramework.MessagePack&pullRequest=6&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/no-data.svg '') No data about Coverage  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed.svg '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=nanoframework_nanoFramework.MessagePack&pullRequest=6&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=nanoframework_nanoFramework.MessagePack&pullRequest=6)


author_association: NONE
user: login: RelaxSpirit
created_at: 2025-04-23T14:40:25Z
body: > LGTM! I've fixed some left nits. Thanks for adding the benchmark project. Now we have a completely documented alternative library!

Thank you for your help! The most difficult thing is to put the code in order, not any creativity :))
Of course, there are still points in the library that need improvement, but this is already an order of necessity :)
author_association: COLLABORATOR