{"id":19244386,"url":"https://github.com/nanoframework/nanoframework.benchmark","last_synced_at":"2025-09-20T10:42:34.021Z","repository":{"id":58631788,"uuid":"530836009","full_name":"nanoframework/nanoFramework.Benchmark","owner":"nanoframework","description":"📦 A benchmark library for .NET nanoFramework inspired in BenchmarkDotNet","archived":false,"fork":false,"pushed_at":"2025-05-01T00:56:38.000Z","size":178,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-09-20T10:42:32.742Z","etag":null,"topics":["benchmarking","csharp","dotnet","embedded-systems","hacktoberfest","nanoframework"],"latest_commit_sha":null,"homepage":"https://www.nanoframework.net","language":"C#","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nanoframework.png","metadata":{"funding":{"open_collective":"nanoframework","github":"nanoframework"},"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-08-30T21:23:18.000Z","updated_at":"2025-05-01T00:48:21.000Z","dependencies_parsed_at":"2023-02-04T00:01:32.433Z","dependency_job_id":"a7b6d84a-1bf1-4af5-84f6-7c3fe6d81cf5","html_url":"https://github.com/nanoframework/nanoFramework.Benchmark","commit_stats":{"total_commits":90,"total_committers":6,"mean_commits":15.0,"dds":"0.37777777777777777","last_synced_commit":"4c8fe5a4aa3772f3b56b9901404913ccfeb1c77e"},"previous_names":[],"tags_count":57,"template":false,"template_full_name":null,"purl":"pkg:github/nanoframework/nanoFramework.Benchmark","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nanoframework%2FnanoFramework.Benchmark","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nanoframework%2FnanoFramework.Benchmark/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nanoframework%2FnanoFramework.Benchmark/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nanoframework%2FnanoFramework.Benchmark/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nanoframework","download_url":"https://codeload.github.com/nanoframework/nanoFramework.Benchmark/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nanoframework%2FnanoFramework.Benchmark/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276085238,"owners_count":25582513,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-20T02:00:10.207Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["benchmarking","csharp","dotnet","embedded-systems","hacktoberfest","nanoframework"],"created_at":"2024-11-09T17:23:12.146Z","updated_at":"2025-09-20T10:42:33.985Z","avatar_url":"https://github.com/nanoframework.png","language":"C#","funding_links":["https://opencollective.com/nanoframework","https://github.com/sponsors/nanoframework"],"categories":[],"sub_categories":[],"readme":"# nanoFramework.Benchmark\n\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=nanoframework_nanoFramework.Benchmark\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=nanoframework_nanoFramework.Benchmark) [![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=nanoframework_nanoFramework.Benchmark\u0026metric=reliability_rating)](https://sonarcloud.io/dashboard?id=nanoframework_nanoFramework.Benchmark) [![#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\u0026logoColor=white\u0026label=Discord\u0026color=7289DA)](https://discord.gg/gCyBu8T)\n\n![nanoFramework logo](https://raw.githubusercontent.com/nanoframework/Home/main/resources/logo/nanoFramework-repo-logo.png)\n\n-----\n\n## Welcome to the .NET **nanoFramework** Benchmark repository\n\n## Build status\n\n| Component | Build Status | NuGet Package |\n|:-|---|---|\n| nanoFramework.Benchmark | [![Build Status](https://dev.azure.com/nanoframework/nanoFramework.Benchmark/_apis/build/status/nanoFramework.Benchmark?repoName=nanoframework%2FnanoFramework.Benchmark\u0026branchName=main)](https://dev.azure.com/nanoframework/nanoFramework.Benchmark/_build/latest?definitionId=97\u0026repoName=nanoframework%2FnanoFramework.Benchmark\u0026branchName=main) | [![NuGet](https://img.shields.io/nuget/v/nanoFramework.Benchmark.svg?label=NuGet\u0026style=flat\u0026logo=nuget)](https://www.nuget.org/packages/nanoFramework.Benchmark/) |\n\n## What is the .NET **nanoFramework** Benchmark\n\nThe nanoFramework.Benchmark tool helps you to measure and track performance of the nanoFramework code.\nYou can easily turn normal method into benchmark by just adding one attribute!\n\nHeavily inspired by [BenchmarkDotNet](https://github.com/dotnet/BenchmarkDotNet).\n\nExample bellow will:\n\n1. Run Setup method once before running any benchmark method.\n2. Run each benchmark method 10 time.\n3. Prepare data to be passed into each parses.\n4. Invoke ConsoleParser (prints data in console as table).\n\n```csharp\npublic class CompareObjectTypesBenchmark\n{\n    object[] array;\n\n    [Setup]\n    public void Setup()\n    {\n        array = new object[] {\n                    (int)42,\n                    (byte)42,\n                    \"This is a super string\",\n                    (ulong)42,\n                    new Version(4, 2)\n                };\n    }\n\n    [Benchmark]\n    public void CompareByString()\n    {\n        for (int i = 0; i \u003c array.Length; i++)\n        {\n            object obja = array.GetValue(i);\n            var typea = obja.GetType();\n            CompareUsingString(typea);\n        }\n    }\n\n    [Benchmark]\n    public void CompareUsingTypeofIf()\n    {\n        for (int i = 0; i \u003c array.Length; i++)\n        {\n            object obja = array.GetValue(i);\n            var typea = obja.GetType();\n            CompareUsingTypeofIf(typea);\n        }\n    }\n\n    [Benchmark]\n    public void CompareUsingTypeofIfReturn()\n    {\n        for (int i = 0; i \u003c array.Length; i++)\n        {\n            object obja = array.GetValue(i);\n            var typea = obja.GetType();\n            CompareUsingTypeofIfReturn(typea);\n        }\n    }\n}\n```\n\nOutput:\n\n```text\nConsole export: CompareObjectTypesBenchmark benchmark class.\n\n| -------------------------------------------------------------------- |\n| MethodName                 | ItterationCount | Mean  | Min   | Max   |\n| -------------------------------------------------------------------- |\n| CompareByString            | 10              | 10 ms | 10 ms | 10 ms |\n| CompareUsingTypeofIf       | 10              | 3 ms  | 0 ms  | 10 ms |\n| CompareUsingTypeofIfReturn | 10              | 5 ms  | 0 ms  | 10 ms |\n| -------------------------------------------------------------------- |\n```\n\n## How to run .NET **nanoFramework** Benchmark\n\nBenchmark methods must be run on real hardware.  (Note - You may received an OutOfMemory exception if you run many iterations and your hardware doesn't have enough memory.)\n\n1. Create a benchmark project using the \"Blank Application (nanoFramework)\" template\n \n ![image](https://user-images.githubusercontent.com/1071761/196533818-1eb4377d-9f7e-4231-8cb2-20d398388700.png)\n\n2. Update the Program.cs file to the following:\n\n```csharp\npublic class Program\n{\n    public static void Main()\n    {\n        BenchmarkRunner.Run(typeof(IAssemblyHandler).Assembly);\n        Thread.Sleep(Timeout.Infinite);\n    }\n}\npublic interface IAssemblyHandler { }\n```\n\n3. Add the nanoFramework.Benchmark nuget package to the project\n\n![image](https://user-images.githubusercontent.com/1071761/196534403-cfd3ea10-d8d7-44cb-bfbd-70baf8423d19.png)\n\n5. Lastly attach a nanoFramework device and run the benchmark project\n\n## Attributes\n\n### Class\n\n#### IterationCount\n\nSpecify how many times each benchmark method needs to be invoked when running benchmark methods. Default is 10.\n\n### Logger\n\nSometimes you can try something that benchmark library does not support. In such situation, instead of debugging code, you may inject logger object. \n\n#### DebugLogger\n\nWrapper around nanoFramework.Logging.Debug. Prints logs to console.\n\n### Methods\n\n#### Setup\n\nSetupAttribute is used to specify which method should be invoked only once before running benchmark methods.\nIt can be used to initialize collections/objects etc.\nThe execution time of setup method is not taken into account when calculating benchmark results.\n\nNote, that setup method must be public and without parameters.\n\n#### Benchmark\n\nBenchmarkAttribute is used to specify which method should be invoked as benchmark.\n\nNote, that benchmark method must be public and without parameters.\n\n#### Baseline\n\nBaselineAttribute is used to specify which method should be considered as baseline for calculation. Add new column \"Ratio\" to output.\n```text\nConsole export: CompareObjectTypesBenchmark benchmark class.\n\n| ------------------------------------------------------------------------------ |\n| MethodName                 | ItterationCount | Mean   | Ratio  | Min   | Max   |\n| ------------------------------------------------------------------------------ |\n| CompareByString            | 100             | 10 ms  | 1.0    | 10 ms | 10 ms |\n| CompareUsingTypeofIf       | 100             | 5.9 ms | 0.5900 | 0 ms  | 10 ms |\n| CompareUsingTypeofIfReturn | 100             | 5.5 ms | 0.5500 | 0 ms  | 10 ms |\n| ------------------------------------------------------------------------------ |\n```\n\n### Parsers\n\nYou can specify parsers as attributes on class. Every parsers is invoked after benchmark run, so you can get results in multiple formats.  \n\nBy default only ConsoleParser is applied.\n\nNew parses can be easily implement by creating new class and implementing IResultParses interface. Also new attribute needs to be  \n\n#### ConsoleParser\n\nYou can use **CsvParserAttribute** to add parser which prints data in console in table format.\n\nOutput example\n\n```text\nConsole export: CompareObjectTypesBenchmark benchmark class.\n\n| -------------------------------------------------------------------- |\n| MethodName                 | ItterationCount | Mean   | Min  | Max   |\n| -------------------------------------------------------------------- |\n| CompareByString            | 100             | 8.9 ms | 0 ms | 10 ms |\n| CompareUsingTypeofIf       | 100             | 4.1 ms | 0 ms | 10 ms |\n| CompareUsingTypeofIfReturn | 100             | 4.2 ms | 0 ms | 10 ms |\n| -------------------------------------------------------------------- |\n```\n\n#### CsvParser\n\nYou can use **CsvParserAttribute** to add parser which prints data in console in CSV format.\n\nOutput example\n\n```text\nCSV export: CompareObjectTypesBenchmark benchmark class.\nMethodName;ItterationCount;Mean;Min;Max\nCompareByString;100;8.9 ms;0 ms;10 ms\nCompareUsingTypeofIf;100;4.1 ms;0 ms;10 ms\nCompareUsingTypeofIfReturn;100;4.2 ms;0 ms;10 ms\n```\n\n## Feedback and documentation\n\nFor documentation, providing feedback, issues and finding out how to contribute please refer to the [Home repo](https://github.com/nanoframework/Home).\n\nJoin our Discord community [here](https://discord.gg/gCyBu8T).\n\n## Credits\n\nThe list of contributors to this project can be found at [CONTRIBUTORS](https://github.com/nanoframework/Home/blob/main/CONTRIBUTORS.md).\n\n## License\n\nThe **nanoFramework** Class Libraries are licensed under the [MIT license](LICENSE.md).\n\n## Code of Conduct\n\nThis project has adopted the code of conduct defined by the Contributor Covenant to clarify expected behaviour in our community.\nFor more information see the [.NET Foundation Code of Conduct](https://dotnetfoundation.org/code-of-conduct).\n\n### .NET Foundation\n\nThis project is supported by the [.NET Foundation](https://dotnetfoundation.org).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnanoframework%2Fnanoframework.benchmark","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnanoframework%2Fnanoframework.benchmark","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnanoframework%2Fnanoframework.benchmark/lists"}