## Tracking perf changes Initial performance: ``` goos: darwin goarch: amd64 pkg: github.com/gomarkdown/markdown BenchmarkEscapeHTML-8 2000000 823 ns/op 0 B/op 0 allocs/op BenchmarkSmartDoubleQuotes-8 300000 5033 ns/op 9872 B/op 56 allocs/op BenchmarkReferenceAmps-8 100000 19538 ns/op 26776 B/op 150 allocs/op BenchmarkReferenceAutoLinks-8 100000 17574 ns/op 24544 B/op 132 allocs/op BenchmarkReferenceBackslashEscapes-8 30000 50977 ns/op 76752 B/op 243 allocs/op BenchmarkReferenceBlockquotesWithCodeBlocks-8 200000 8546 ns/op 12864 B/op 65 allocs/op BenchmarkReferenceCodeBlocks-8 200000 9000 ns/op 14912 B/op 70 allocs/op BenchmarkReferenceCodeSpans-8 200000 8856 ns/op 14992 B/op 69 allocs/op BenchmarkReferenceHardWrappedPara-8 200000 6599 ns/op 11312 B/op 57 allocs/op BenchmarkReferenceHorizontalRules-8 100000 15483 ns/op 23536 B/op 98 allocs/op BenchmarkReferenceInlineHTMLAdvances-8 200000 6839 ns/op 12150 B/op 62 allocs/op BenchmarkReferenceInlineHTMLSimple-8 100000 19940 ns/op 28488 B/op 117 allocs/op BenchmarkReferenceInlineHTMLComments-8 200000 7455 ns/op 13440 B/op 64 allocs/op BenchmarkReferenceLinksInline-8 100000 16425 ns/op 23664 B/op 147 allocs/op BenchmarkReferenceLinksReference-8 30000 54895 ns/op 66464 B/op 416 allocs/op BenchmarkReferenceLinksShortcut-8 100000 17647 ns/op 23776 B/op 158 allocs/op BenchmarkReferenceLiterQuotesInTitles-8 200000 9367 ns/op 14832 B/op 95 allocs/op BenchmarkReferenceMarkdownBasics-8 10000 129772 ns/op 130848 B/op 378 allocs/op BenchmarkReferenceMarkdownSyntax-8 3000 502365 ns/op 461411 B/op 1411 allocs/op BenchmarkReferenceNestedBlockquotes-8 200000 7028 ns/op 12688 B/op 64 allocs/op BenchmarkReferenceOrderedAndUnorderedLists-8 20000 79686 ns/op 107520 B/op 374 allocs/op BenchmarkReferenceStrongAndEm-8 200000 10020 ns/op 17792 B/op 78 allocs/op BenchmarkReferenceTabs-8 200000 12025 ns/op 18224 B/op 81 allocs/op BenchmarkReferenceTidyness-8 200000 8985 ns/op 14432 B/op 71 allocs/op PASS ok github.com/gomarkdown/markdown 45.375s ``` After switching to using interface{} for Node.Data: ``` BenchmarkEscapeHTML-8 2000000 929 ns/op 0 B/op 0 allocs/op BenchmarkSmartDoubleQuotes-8 300000 5126 ns/op 9248 B/op 56 allocs/op BenchmarkReferenceAmps-8 100000 19927 ns/op 17880 B/op 154 allocs/op BenchmarkReferenceAutoLinks-8 100000 20732 ns/op 17360 B/op 141 allocs/op BenchmarkReferenceBackslashEscapes-8 30000 50267 ns/op 38128 B/op 244 allocs/op BenchmarkReferenceBlockquotesWithCodeBlocks-8 200000 8988 ns/op 10912 B/op 67 allocs/op BenchmarkReferenceCodeBlocks-8 200000 8611 ns/op 12256 B/op 74 allocs/op BenchmarkReferenceCodeSpans-8 200000 8256 ns/op 11248 B/op 69 allocs/op BenchmarkReferenceHardWrappedPara-8 200000 6739 ns/op 9856 B/op 57 allocs/op BenchmarkReferenceHorizontalRules-8 100000 15503 ns/op 15600 B/op 104 allocs/op BenchmarkReferenceInlineHTMLAdvances-8 200000 6874 ns/op 10278 B/op 62 allocs/op BenchmarkReferenceInlineHTMLSimple-8 100000 22271 ns/op 18552 B/op 121 allocs/op BenchmarkReferenceInlineHTMLComments-8 200000 8315 ns/op 10736 B/op 64 allocs/op BenchmarkReferenceLinksInline-8 100000 16155 ns/op 16912 B/op 152 allocs/op BenchmarkReferenceLinksReference-8 30000 52387 ns/op 38192 B/op 445 allocs/op BenchmarkReferenceLinksShortcut-8 100000 17111 ns/op 16592 B/op 167 allocs/op BenchmarkReferenceLiterQuotesInTitles-8 200000 9164 ns/op 12048 B/op 97 allocs/op BenchmarkReferenceMarkdownBasics-8 10000 129262 ns/op 87264 B/op 416 allocs/op BenchmarkReferenceMarkdownSyntax-8 3000 496873 ns/op 293906 B/op 1559 allocs/op BenchmarkReferenceNestedBlockquotes-8 200000 6854 ns/op 10192 B/op 64 allocs/op BenchmarkReferenceOrderedAndUnorderedLists-8 20000 79633 ns/op 55024 B/op 447 allocs/op BenchmarkReferenceStrongAndEm-8 200000 9637 ns/op 12176 B/op 78 allocs/op BenchmarkReferenceTabs-8 100000 12164 ns/op 13776 B/op 87 allocs/op BenchmarkReferenceTidyness-8 200000 8677 ns/op 11296 B/op 75 allocs/op ``` Not necessarily faster, but uses less bytes per op (but sometimes more allocs). After tweaking the API: ``` $ ./s/run-bench.sh go test -bench=. -test.benchmem goos: darwin goarch: amd64 pkg: github.com/gomarkdown/markdown BenchmarkEscapeHTML-8 2000000 834 ns/op 0 B/op 0 allocs/op BenchmarkSmartDoubleQuotes-8 300000 3486 ns/op 6160 B/op 27 allocs/op BenchmarkReferenceAmps-8 100000 18158 ns/op 14792 B/op 125 allocs/op BenchmarkReferenceAutoLinks-8 100000 16824 ns/op 14272 B/op 112 allocs/op BenchmarkReferenceBackslashEscapes-8 30000 44066 ns/op 35040 B/op 215 allocs/op BenchmarkReferenceBlockquotesWithCodeBlocks-8 200000 6868 ns/op 7824 B/op 38 allocs/op BenchmarkReferenceCodeBlocks-8 200000 7157 ns/op 9168 B/op 45 allocs/op BenchmarkReferenceCodeSpans-8 200000 6663 ns/op 8160 B/op 40 allocs/op BenchmarkReferenceHardWrappedPara-8 300000 4821 ns/op 6768 B/op 28 allocs/op BenchmarkReferenceHorizontalRules-8 100000 13033 ns/op 12512 B/op 75 allocs/op BenchmarkReferenceInlineHTMLAdvances-8 300000 4998 ns/op 7190 B/op 33 allocs/op BenchmarkReferenceInlineHTMLSimple-8 100000 17696 ns/op 15464 B/op 92 allocs/op BenchmarkReferenceInlineHTMLComments-8 300000 5506 ns/op 7648 B/op 35 allocs/op BenchmarkReferenceLinksInline-8 100000 14450 ns/op 13824 B/op 123 allocs/op BenchmarkReferenceLinksReference-8 30000 52561 ns/op 35104 B/op 416 allocs/op BenchmarkReferenceLinksShortcut-8 100000 15616 ns/op 13504 B/op 138 allocs/op BenchmarkReferenceLiterQuotesInTitles-8 200000 7772 ns/op 8960 B/op 68 allocs/op BenchmarkReferenceMarkdownBasics-8 10000 121436 ns/op 84176 B/op 387 allocs/op BenchmarkReferenceMarkdownSyntax-8 3000 487404 ns/op 290818 B/op 1530 allocs/op BenchmarkReferenceNestedBlockquotes-8 300000 5098 ns/op 7104 B/op 35 allocs/op BenchmarkReferenceOrderedAndUnorderedLists-8 20000 74422 ns/op 51936 B/op 418 allocs/op BenchmarkReferenceStrongAndEm-8 200000 7888 ns/op 9088 B/op 49 allocs/op BenchmarkReferenceTabs-8 200000 10061 ns/op 10688 B/op 58 allocs/op BenchmarkReferenceTidyness-8 200000 7152 ns/op 8208 B/op 46 allocs/op ok github.com/gomarkdown/markdown 40.809s ``` After refactoring Renderer: ``` BenchmarkEscapeHTML-8 2000000 883 ns/op 0 B/op 0 allocs/op BenchmarkSmartDoubleQuotes-8 300000 3717 ns/op 6208 B/op 29 allocs/op BenchmarkReferenceAmps-8 100000 19135 ns/op 14680 B/op 123 allocs/op BenchmarkReferenceAutoLinks-8 100000 17142 ns/op 14176 B/op 110 allocs/op BenchmarkReferenceBackslashEscapes-8 30000 54616 ns/op 35088 B/op 217 allocs/op BenchmarkReferenceBlockquotesWithCodeBlocks-8 200000 7993 ns/op 7872 B/op 40 allocs/op BenchmarkReferenceCodeBlocks-8 200000 8285 ns/op 9216 B/op 47 allocs/op BenchmarkReferenceCodeSpans-8 200000 7684 ns/op 8208 B/op 42 allocs/op BenchmarkReferenceHardWrappedPara-8 200000 5595 ns/op 6816 B/op 30 allocs/op BenchmarkReferenceHorizontalRules-8 100000 16444 ns/op 12560 B/op 77 allocs/op BenchmarkReferenceInlineHTMLAdvances-8 200000 5415 ns/op 7238 B/op 35 allocs/op BenchmarkReferenceInlineHTMLSimple-8 100000 19867 ns/op 15512 B/op 94 allocs/op BenchmarkReferenceInlineHTMLComments-8 200000 6026 ns/op 7696 B/op 37 allocs/op BenchmarkReferenceLinksInline-8 100000 14864 ns/op 13664 B/op 120 allocs/op BenchmarkReferenceLinksReference-8 30000 52479 ns/op 34816 B/op 401 allocs/op BenchmarkReferenceLinksShortcut-8 100000 15812 ns/op 13472 B/op 135 allocs/op BenchmarkReferenceLiterQuotesInTitles-8 200000 7767 ns/op 8880 B/op 68 allocs/op BenchmarkReferenceMarkdownBasics-8 10000 131065 ns/op 84048 B/op 386 allocs/op BenchmarkReferenceMarkdownSyntax-8 2000 515604 ns/op 289953 B/op 1501 allocs/op BenchmarkReferenceNestedBlockquotes-8 200000 5655 ns/op 7152 B/op 37 allocs/op BenchmarkReferenceOrderedAndUnorderedLists-8 20000 84188 ns/op 51984 B/op 420 allocs/op BenchmarkReferenceStrongAndEm-8 200000 8664 ns/op 9136 B/op 51 allocs/op BenchmarkReferenceTabs-8 100000 11110 ns/op 10736 B/op 60 allocs/op BenchmarkReferenceTidyness-8 200000 7628 ns/op 8256 B/op 48 allocs/op ok github.com/gomarkdown/markdown 40.841s ``` After Node refactor to have Children array: ``` BenchmarkEscapeHTML-8 2000000 901 ns/op 0 B/op 0 allocs/op BenchmarkSmartDoubleQuotes-8 300000 3905 ns/op 6224 B/op 31 allocs/op BenchmarkReferenceAmps-8 100000 22216 ns/op 15560 B/op 157 allocs/op BenchmarkReferenceAutoLinks-8 100000 20335 ns/op 14824 B/op 146 allocs/op BenchmarkReferenceBackslashEscapes-8 20000 69174 ns/op 37392 B/op 316 allocs/op BenchmarkReferenceBlockquotesWithCodeBlocks-8 200000 8443 ns/op 7968 B/op 48 allocs/op BenchmarkReferenceCodeBlocks-8 200000 9250 ns/op 9392 B/op 58 allocs/op BenchmarkReferenceCodeSpans-8 200000 8515 ns/op 8432 B/op 54 allocs/op BenchmarkReferenceHardWrappedPara-8 200000 5738 ns/op 6856 B/op 34 allocs/op BenchmarkReferenceHorizontalRules-8 100000 20864 ns/op 13648 B/op 93 allocs/op BenchmarkReferenceInlineHTMLAdvances-8 200000 6187 ns/op 7310 B/op 40 allocs/op BenchmarkReferenceInlineHTMLSimple-8 50000 23793 ns/op 16128 B/op 114 allocs/op BenchmarkReferenceInlineHTMLComments-8 200000 7060 ns/op 7840 B/op 44 allocs/op BenchmarkReferenceLinksInline-8 100000 18432 ns/op 14496 B/op 153 allocs/op BenchmarkReferenceLinksReference-8 20000 67666 ns/op 37136 B/op 502 allocs/op BenchmarkReferenceLinksShortcut-8 100000 19324 ns/op 13984 B/op 162 allocs/op BenchmarkReferenceLiterQuotesInTitles-8 200000 8998 ns/op 9320 B/op 83 allocs/op BenchmarkReferenceMarkdownBasics-8 10000 160908 ns/op 88152 B/op 518 allocs/op BenchmarkReferenceMarkdownSyntax-8 2000 707160 ns/op 303801 B/op 2044 allocs/op BenchmarkReferenceNestedBlockquotes-8 200000 6740 ns/op 7248 B/op 45 allocs/op BenchmarkReferenceOrderedAndUnorderedLists-8 10000 115808 ns/op 55052 B/op 626 allocs/op BenchmarkReferenceStrongAndEm-8 100000 10540 ns/op 9416 B/op 72 allocs/op BenchmarkReferenceTabs-8 100000 13171 ns/op 10968 B/op 77 allocs/op BenchmarkReferenceTidyness-8 200000 8903 ns/op 8404 B/op 62 allocs/op PASS ok github.com/gomarkdown/markdown 43.477s ``` It's slower (but opens up possibilities for further improvements). After refactoring to make ast.Node a top-level thing. ``` BenchmarkEscapeHTML-8 2000000 829 ns/op 0 B/op 0 allocs/op BenchmarkSmartDoubleQuotes-8 300000 3998 ns/op 6192 B/op 31 allocs/op BenchmarkReferenceAmps-8 50000 27389 ns/op 15480 B/op 153 allocs/op BenchmarkReferenceAutoLinks-8 50000 23106 ns/op 14656 B/op 137 allocs/op BenchmarkReferenceBackslashEscapes-8 10000 112435 ns/op 36696 B/op 315 allocs/op BenchmarkReferenceBlockquotesWithCodeBlocks-8 200000 9227 ns/op 7856 B/op 46 allocs/op BenchmarkReferenceCodeBlocks-8 200000 10469 ns/op 9248 B/op 54 allocs/op BenchmarkReferenceCodeSpans-8 200000 10522 ns/op 8368 B/op 54 allocs/op BenchmarkReferenceHardWrappedPara-8 200000 6354 ns/op 6784 B/op 34 allocs/op BenchmarkReferenceHorizontalRules-8 50000 32393 ns/op 13952 B/op 87 allocs/op BenchmarkReferenceInlineHTMLAdvances-8 200000 6894 ns/op 7238 B/op 40 allocs/op BenchmarkReferenceInlineHTMLSimple-8 50000 32942 ns/op 15864 B/op 110 allocs/op BenchmarkReferenceInlineHTMLComments-8 200000 8181 ns/op 7776 B/op 44 allocs/op BenchmarkReferenceLinksInline-8 100000 21679 ns/op 14400 B/op 148 allocs/op BenchmarkReferenceLinksReference-8 20000 83928 ns/op 36688 B/op 473 allocs/op BenchmarkReferenceLinksShortcut-8 100000 22053 ns/op 13872 B/op 153 allocs/op BenchmarkReferenceLiterQuotesInTitles-8 100000 10784 ns/op 9296 B/op 81 allocs/op BenchmarkReferenceMarkdownBasics-8 5000 237097 ns/op 87760 B/op 480 allocs/op BenchmarkReferenceMarkdownSyntax-8 1000 1465402 ns/op 300769 B/op 1896 allocs/op BenchmarkReferenceNestedBlockquotes-8 200000 7461 ns/op 7152 B/op 45 allocs/op BenchmarkReferenceOrderedAndUnorderedLists-8 5000 212256 ns/op 53724 B/op 553 allocs/op BenchmarkReferenceStrongAndEm-8 100000 13018 ns/op 9264 B/op 72 allocs/op BenchmarkReferenceTabs-8 100000 15005 ns/op 10752 B/op 71 allocs/op BenchmarkReferenceTidyness-8 200000 10308 ns/op 8292 B/op 58 allocs/op PASS ok github.com/gomarkdown/markdown 42.176s ```