You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.7 KiB
59 lines
1.7 KiB
#-----------------------------------------------------------------
|
|
# Benchmarking utility for internal use.
|
|
#
|
|
# Use with Python 3.6+
|
|
#
|
|
# Eli Bendersky [https://eli.thegreenplace.net/]
|
|
# License: BSD
|
|
#-----------------------------------------------------------------
|
|
import os
|
|
import statistics
|
|
import sys
|
|
import time
|
|
|
|
sys.path.extend(['.', '..'])
|
|
|
|
from pycparser import c_parser, c_ast
|
|
|
|
|
|
def measure_parse(text, n, progress_cb):
|
|
"""Measure the parsing of text with pycparser.
|
|
|
|
text should represent a full file. n is the number of iterations to measure.
|
|
progress_cb will be called with the iteration number each time one is done.
|
|
|
|
Returns a list of elapsed times, one per iteration.
|
|
"""
|
|
times = []
|
|
for i in range(n):
|
|
parser = c_parser.CParser()
|
|
t1 = time.time()
|
|
ast = parser.parse(text, '')
|
|
elapsed = time.time() - t1
|
|
assert isinstance(ast, c_ast.FileAST)
|
|
times.append(elapsed)
|
|
progress_cb(i)
|
|
return times
|
|
|
|
|
|
def measure_file(filename, n):
|
|
progress_cb = lambda i: print('.', sep='', end='', flush=True)
|
|
with open(filename) as f:
|
|
print('%-25s' % os.path.basename(filename), end='', flush=True)
|
|
text = f.read()
|
|
times = measure_parse(text, n, progress_cb)
|
|
print(' Mean: %.3f Stddev: %.3f' % (statistics.mean(times),
|
|
statistics.stdev(times)))
|
|
|
|
|
|
NUM_RUNS = 5
|
|
|
|
|
|
if __name__ == '__main__':
|
|
if len(sys.argv) < 2:
|
|
print("Usage: %s <dir with input files>")
|
|
sys.exit(1)
|
|
for filename in os.listdir(sys.argv[1]):
|
|
filename = os.path.join(sys.argv[1], filename)
|
|
measure_file(filename, NUM_RUNS)
|