| #----------------------------------------------------------------- |
| # 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) |