From a262e42980379d24011a48abd5ec4313395daea9 Mon Sep 17 00:00:00 2001 From: Alexandre Mutel Date: Thu, 16 Jun 2016 12:24:01 +0900 Subject: [PATCH] Update readme and benchmarks --- img/BenchmarkCPU.png | Bin 0 -> 9282 bytes img/BenchmarkMemory.png | Bin 0 -> 8809 bytes readme.md | 49 ++++++++++++++++++++++++++++------------ 3 files changed, 34 insertions(+), 15 deletions(-) create mode 100644 img/BenchmarkCPU.png create mode 100644 img/BenchmarkMemory.png diff --git a/img/BenchmarkCPU.png b/img/BenchmarkCPU.png new file mode 100644 index 0000000000000000000000000000000000000000..50a3dc2f1c64aa1caec7f6155fb2c455a5a8d36c GIT binary patch literal 9282 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 literal 0 HcmV?d00001 diff --git a/readme.md b/readme.md index 02c227a4e..b8d075ffc 100644 --- a/readme.md +++ b/readme.md @@ -81,13 +81,23 @@ This software is released under the [BSD-Clause 2 license](https://github.com/lu This is an early preview of the benchmarking against various implementations: -- Markdig: itself -- CommonMarkCpp: [cmark](https://github.com/jgm/cmark), Reference C implementation of CommonMark, no support for extensions -- [CommonMark.NET](https://github.com/Knagis/CommonMark.NET): CommonMark implementation for .NET, no support for extensions, port of cmark - - [CommonMarkNet (devel)](https://github.com/AMDL/CommonMark.NET/tree/pipe-tables): An evolution of CommonMark.NET, supports extensions, not released yet +**C implementations**: + +- [cmark](https://github.com/jgm/cmark): Reference C implementation of CommonMark, no support for extensions +- [Moonshine](https://github.com/brandonc/moonshine): popular C Markdown processor + +**.NET implementations**: + +- [Markdig](https://github.com/lunet-io/markdig): itself +- [CommonMark.NET(master)](https://github.com/Knagis/CommonMark.NET): CommonMark implementation for .NET, no support for extensions, port of cmark + - [CommonMark.NET(pipe_tables)](https://github.com/AMDL/CommonMark.NET/tree/pipe-tables): An evolution of CommonMark.NET, supports extensions, not released yet - [MarkdownDeep](https://github.com/toptensoftware/markdowndeep) another .NET implementation - [MarkdownSharp](https://github.com/Kiri-rin/markdownsharp): Open source C# implementation of Markdown processor, as featured on Stack Overflow, regexp based. -- [Moonshine](https://github.com/brandonc/moonshine): popular C Markdown processor +- [Marked.NET](https://github.com/T-Alex/MarkedNet) port of original [marked.js](https://github.com/chjj/marked) project + +**JavaScript/V8 implementations**: + +- [Strike.V8](https://github.com/SimonCropp/Strike) [marked.js](https://github.com/chjj/marked) running in Google V8 (not .NET based) ### Analysis of the results: @@ -95,13 +105,19 @@ This is an early preview of the benchmarking against various implementations: - **Among the best in CPU**, Extremelly competitive and often faster than other implementations (not feature wise equivalent) - **15% to 30% less allocations** and GC pressure +Because Marked.NET and MarkdownSharp are way too slow, we couldn't include them in the following charts: + +![BenchMark CPU Time](img/BenchmarkCPU.png) + +![BenchMark Memory](img/BenchmarkMemory.png) + ### Performance in x86: ``` -BenchmarkDotNet-Dev=v0.9.6.0+ +BenchmarkDotNet-Dev=v0.9.7.0+ OS=Microsoft Windows NT 6.2.9200.0 -Processor=Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz, ProcessorCount=8 +Processor=Intel(R) Core(TM) i7-4770 CPU 3.40GHz, ProcessorCount=8 Frequency=3319351 ticks, Resolution=301.2637 ns, Timer=TSC HostCLR=MS.NET 4.0.30319.42000, Arch=32-bit RELEASE JitModules=clrjit-v4.6.1080.0 @@ -109,14 +125,17 @@ JitModules=clrjit-v4.6.1080.0 Type=Program Mode=SingleRun LaunchCount=2 WarmupCount=2 TargetCount=10 - Method | Median | StdDev | Gen 0 | Gen 1 | Gen 2 | Bytes Allocated/Op | ---------------------- |---------- |---------- |------- |------ |------- |------------------- | - TestMarkdig | 5.4332 ms | 0.0809 ms | 96.00 | 36.00 | 84.00 | 1,218,643.59 | - TestCommonMarkCpp | 4.0150 ms | 0.1208 ms | - | - | 180.00 | 454,859.74 | - TestCommonMarkNet | 4.5448 ms | 0.0323 ms | 193.00 | 12.00 | 84.00 | 1,406,367.27 | - TestCommonMarkNetNew | 5.4811 ms | 0.0327 ms | 193.00 | 96.00 | 84.00 | 1,738,465.42 | - TestMarkdownDeep | 7.5881 ms | 0.0554 ms | 205.00 | 96.00 | 84.00 | 1,758,383.79 | - TestMoonshine | 5.8586 ms | 0.0764 ms | - | - | 215.00 | 565,000.72 | + Method | Median | StdDev | Scaled | Gen 0 | Gen 1 | Gen 2 | Bytes Allocated/Op | +---------------------------- |------------ |---------- |------- |------ |------ |------ |------------------- | + Markdig | 5.5316 ms | 0.0372 ms | 0.71 | 56.00 | 21.00 | 49.00 | 1,285,917.31 | + CommonMark.NET(master) | 4.7035 ms | 0.0422 ms | 0.60 | 113.00 | 7.00 | 49.00 | 1,502,404.60 | + CommonMark.NET(pipe_tables) | 5.6164 ms | 0.0298 ms | 0.72 | 111.00 | 56.00 | 49.00 | 1,863,128.13 | + MarkdownDeep | 7.8193 ms | 0.0334 ms | 1.00 | 120.00 | 56.00 | 49.00 | 1,884,854.85 | + cmark | 4.2698 ms | 0.1526 ms | 0.55 | - | - | - | NA | + Moonshine | 6.0929 ms | 0.1053 ms | 1.28 | - | - | - | NA | + Strike.V8 | 10.5895 ms | 0.0492 ms | 1.35 | - | - | - | NA | + Marked.NET | 207.3169 ms | 5.2628 ms | 26.51 | 0.00 | 0.00 | 0.00 | 303,125,228.65 | + MarkdownSharp | 675.0185 ms | 2.8447 ms | 86.32 | 40.00 | 27.00 | 41.00 | 2,413,394.17 | ``` ### Performance for x64: