rpnifs/tests/benchmark.py
2020-01-25 06:42:25 +01:00

78 lines
2 KiB
Python

#!/usr/bin/python3
import sys
import random
import time
import warnings
try:
import pyrpn
except (ImportError, NameError) as e:
print("Error importing pyrpn. Try to run make.",
file=sys.stderr)
raise e
#expr_count = 0x200
#max_iter = 0x3000
#argc = 2
#sz = 0x20
expr_count = 5000
max_iter = 0x5000
argc = 2
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:
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 tqr(expr_count):
rnd_expr = pyrpn.random_expr(argc, sz)
all_start = time.time()
expr = pyrpn.RPNExpr(rnd_expr, argc)
start_op = time.time()
rnds = random.choice(rnd_samples)
for rnd in rnds:
expr.eval(*rnd)
time_op += time.time() - start_op
tot += time.time() - all_start
if write:
sys.stderr.write(".")
sys.stderr.flush()
if write:
sys.stderr.write("\n")
total = time.time() - start
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)