Completed
Push — master ( f43d3b...32f29f )
by Dongxin
01:09
created

benchmark_markdown()   A

Complexity

Conditions 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 1
dl 0
loc 4
rs 10
1
# coding: utf-8
2
3
import os
4
import time
5
import functools
6
7
8
class benchmark(object):
9
    suites = []
10
11
    def __init__(self, name):
12
        self._name = name
13
14
    def __call__(self, func):
15
        @functools.wraps(func)
16
        def wrapper(text, loops=1000):
17
            start = time.clock()
18
            while loops:
19
                func(text)
20
                loops -= 1
21
            end = time.clock()
22
            return end - start
23
        # register
24
        benchmark.suites.append((self._name, wrapper))
25
        return wrapper
26
27
    @classmethod
28
    def bench(cls, text, loops=1000):
29
        print('Parsing the Markdown Syntax document %d times...' % loops)
30
        for name, func in cls.suites:
31
            try:
32
                total = func(text, loops=loops)
33
                print('{0}: {1}'.format(name, total))
34
            except ImportError:
35
                print('{0} is not available'.format(name))
36
37
38
@benchmark('mistune')
39
def benchmark_mistune(text):
40
    import mistune
41
    mistune.markdown(text)
42
43
44
@benchmark('misaka')
45
def benchmark_misaka(text):
46
    import misaka as m
47
    # mistune has all these features
48
    extensions = (
49
        m.EXT_NO_INTRA_EMPHASIS | m.EXT_FENCED_CODE | m.EXT_AUTOLINK |
50
        m.EXT_TABLES | m.EXT_STRIKETHROUGH
51
    )
52
    md = m.Markdown(m.HtmlRenderer(), extensions=extensions)
53
    md.render(text)
54
55
56
@benchmark('markdown2')
57
def benchmark_markdown2(text):
58
    import markdown2
59
    extras = ['code-friendly', 'fenced-code-blocks', 'footnotes']
60
    markdown2.markdown(text, extras=extras)
61
62
63
@benchmark('markdown')
64
def benchmark_markdown(text):
65
    import markdown
66
    markdown.markdown(text, ['extra'])
67
68
69
@benchmark('cMarkdown')
70
def benchmark_cMarkdown(text):
71
    import cMarkdown
72
    cMarkdown.markdown(text)
73
74
75
@benchmark('discount')
76
def benchmark_discount(text):
77
    import discount
78
    discount.Markdown(text).get_html_content()
79
80
81
@benchmark('hoep')
82
def benchmark_hoep(text):
83
    import hoep as m
84
    # mistune has all these features
85
    extensions = (
86
        m.EXT_NO_INTRA_EMPHASIS | m.EXT_FENCED_CODE | m.EXT_AUTOLINK |
87
        m.EXT_TABLES | m.EXT_STRIKETHROUGH | m.EXT_FOOTNOTES
88
    )
89
    md = m.Hoep(extensions=extensions)
90
    md.render(text.decode('utf-8'))
91
92
93
if __name__ == '__main__':
94
    root = os.path.dirname(__file__)
95
    filepath = os.path.join(
96
        root, 'fixtures/normal', 'markdown_documentation_syntax.text'
97
    )
98
    with open(filepath, 'r') as f:
99
        text = f.read()
100
101
    benchmark.bench(text)
102