dhodovsk / source-git / ghc-aeson

Forked from source-git/ghc-aeson 4 years ago
Clone

Blame benchmarks/bench-parse.py

Packit 9a2dfb
#!/usr/bin/env python
Packit 9a2dfb
Packit 9a2dfb
import os, re, subprocess, sys
Packit 9a2dfb
Packit 9a2dfb
result_re = re.compile(r'^\s*(\d+) good, (\d+\.\d+)s$', re.M)
Packit 9a2dfb
Packit 9a2dfb
if len(sys.argv) > 1:
Packit 9a2dfb
    parser_exe = sys.argv[1]
Packit 9a2dfb
else:
Packit 9a2dfb
    parser_exe = ('dist/build/aeson-benchmark-aeson-parse/' +
Packit 9a2dfb
                  'aeson-benchmark-aeson-parse')
Packit 9a2dfb
Packit 9a2dfb
def run(count, filename):
Packit 9a2dfb
    print '    %s :: %s times' % (filename, count)
Packit 9a2dfb
    p = subprocess.Popen([parser_exe, '65536', str(count), filename],
Packit 9a2dfb
                         stdout=subprocess.PIPE)
Packit 9a2dfb
    output = p.stdout.read()
Packit 9a2dfb
    p.wait()
Packit 9a2dfb
    m = result_re.search(output)
Packit 9a2dfb
    if not m:
Packit 9a2dfb
        print >> sys.stderr, 'run gave confusing output!?'
Packit 9a2dfb
        sys.stderr.write(output)
Packit 9a2dfb
        return
Packit 9a2dfb
    else:
Packit 9a2dfb
        #sys.stdout.write(output)
Packit 9a2dfb
        pass
Packit 9a2dfb
    good, elapsed = m.groups()
Packit 9a2dfb
    good, elapsed = int(good), float(elapsed)
Packit 9a2dfb
    st = os.stat(filename)
Packit 9a2dfb
    parses_per_second = good / elapsed
Packit 9a2dfb
    mb_per_second = st.st_size * parses_per_second / 1048576
Packit 9a2dfb
    print ('      %.3f seconds, %d parses/sec, %.3f MB/sec' %
Packit 9a2dfb
           (elapsed, parses_per_second, mb_per_second))
Packit 9a2dfb
    return parses_per_second, mb_per_second, st.st_size, elapsed
Packit 9a2dfb
Packit 9a2dfb
def runtimes(count, filename, times=1):
Packit 9a2dfb
    for i in xrange(times):
Packit 9a2dfb
        yield run(count, filename)
Packit 9a2dfb
Packit 9a2dfb
info = '''
Packit 9a2dfb
json-data/twitter1.json   60000
Packit 9a2dfb
json-data/twitter10.json  13000
Packit 9a2dfb
json-data/twitter20.json   7500
Packit 9a2dfb
json-data/twitter50.json   2500
Packit 9a2dfb
json-data/twitter100.json  1000
Packit 9a2dfb
json-data/jp10.json        4000
Packit 9a2dfb
json-data/jp50.json        1200
Packit 9a2dfb
json-data/jp100.json        700
Packit 9a2dfb
'''
Packit 9a2dfb
Packit 9a2dfb
for i in info.strip().splitlines():
Packit 9a2dfb
    name, count = i.split()
Packit 9a2dfb
    best = sorted(runtimes(int(count), name, times=3), reverse=True)[0]
Packit 9a2dfb
    parses_per_second, mb_per_second, size, elapsed = best
Packit 9a2dfb
    print ('%.1f KB: %d msg\\/sec (%.1f MB\\/sec)' %
Packit 9a2dfb
           (size / 1024.0, int(round(parses_per_second)), mb_per_second))