diff --git a/Makefile b/Makefile index 02f50a3..71ec49b 100644 --- a/Makefile +++ b/Makefile @@ -73,7 +73,7 @@ doc/.doxygen.stamp: $(wildcard *.c) $(wildcard *.h) Doxyfile checks: runtest unittest benchmark benchmark: pyrpn.so - PYTHONPATH=`pwd` $(PYTHON) tests/benchmark.py + PYTHONPATH=`pwd` $(PYTHON) tests/benchmark.py 0x200 0x3000 unittest: pyrpn.so PYTHONPATH=`pwd` $(PYTHON) -m unittest diff --git a/tests/benchmark.py b/tests/benchmark.py index c9ec59c..f8342b9 100644 --- a/tests/benchmark.py +++ b/tests/benchmark.py @@ -3,6 +3,8 @@ import sys import random import time +import warnings + try: import pyrpn @@ -11,29 +13,48 @@ except (ImportError, NameError) as e: file=sys.stderr) raise e - -expr_count = 0x200 -max_iter = 0x3000 +#expr_count = 0x200 +#max_iter = 0x3000 +#argc = 2 +#sz = 0x20 +expr_count = 5000 +max_iter = 0x5000 argc = 2 -sz = 0x10 +sz = 0x30 + +try: + from tqdm import tqdm + tqr = lambda m: tqdm(range(m), unit='expr', unit_scale=True, + #unit_scale=max_iter>>10, + mininterval=.15) + write=False +except (ImportError, NameError) as e: + warnings.warn('tqdm not found') + tqr = range + write=True if len(sys.argv) > 1: expr_count = int(sys.argv[1], 0) if len(sys.argv) > 2: max_iter = int(sys.argv[2], 0) if len(sys.argv) > 3: - argc = int(sys.argv[3], 0) -if len(sys.argv) > 4: sz = int(sys.argv[4], 0) +if len(sys.argv) > 4: + argc = int(sys.argv[3], 0) tot = 0 time_op = 0 start = time.time() IMAX = (1<<63)-1 samples = 8 + +print("Running %dK iter on %d expressions with %d op" % (max_iter//1000, + expr_count, + sz)) + rnd_samples = [[[random.randint(0, IMAX) for _ in range(argc)] for _ in range(max_iter)] for _ in range(samples)] -for i in range(expr_count): +for i in tqr(expr_count): rnd_expr = pyrpn.random_expr(argc, sz) all_start = time.time() expr = pyrpn.RPNExpr(rnd_expr, argc) @@ -43,9 +64,15 @@ for i in range(expr_count): expr.eval(*rnd) time_op += time.time() - start_op tot += time.time() - all_start - sys.stderr.write(".") - sys.stderr.flush() -sys.stderr.write("\n") + if write: + sys.stderr.write(".") + sys.stderr.flush() +if write: + sys.stderr.write("\n") total = time.time() - start -print("Runned %.2fs" % total) -print("%.1fK iter/s %.1fms per expr" % (max_iter*expr_count/time_op/1000, tot/expr_count*1000)) +print("Runned %dK iter on %d expressions in %.2fs" % (max_iter//1000, + expr_count, total)) +msg = "%.1fK iter/s %.1fms per expr (%dK iter, %d op per expr)" +msg %= (max_iter*expr_count/time_op/1000, tot/expr_count*1000, + max_iter//1000, sz) +print(msg)