Fast IFS using RPN notation
python
c
x86-64
nasm
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.

benchmark.py 1.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #!/usr/bin/python3
  2. import sys
  3. import random
  4. import time
  5. try:
  6. import pyrpn
  7. except (ImportError, NameError) as e:
  8. print("Error importing pyrpn. Try to run make.",
  9. file=sys.stderr)
  10. raise e
  11. expr_count = 0x200
  12. max_iter = 0x3000
  13. argc = 2
  14. sz = 0x10
  15. if len(sys.argv) > 1:
  16. expr_count = int(sys.argv[1], 0)
  17. if len(sys.argv) > 2:
  18. max_iter = int(sys.argv[2], 0)
  19. if len(sys.argv) > 3:
  20. argc = int(sys.argv[3], 0)
  21. if len(sys.argv) > 4:
  22. sz = int(sys.argv[4], 0)
  23. tot = 0
  24. time_op = 0
  25. start = time.time()
  26. IMAX = (1<<63)-1
  27. samples = 8
  28. rnd_samples = [[[random.randint(0, IMAX) for _ in range(argc)] for _ in range(max_iter)]
  29. for _ in range(samples)]
  30. for i in range(expr_count):
  31. rnd_expr = pyrpn.random_expr(argc, sz)
  32. all_start = time.time()
  33. expr = pyrpn.RPNExpr(rnd_expr, argc)
  34. start_op = time.time()
  35. rnds = random.choice(rnd_samples)
  36. for rnd in rnds:
  37. expr.eval(*rnd)
  38. time_op += time.time() - start_op
  39. tot += time.time() - all_start
  40. sys.stderr.write(".")
  41. sys.stderr.flush()
  42. sys.stderr.write("\n")
  43. total = time.time() - start
  44. print("Runned %.2fs" % total)
  45. print("%.1fK iter/s %.1fms per expr" % (max_iter*expr_count/time_op/1000, tot/expr_count*1000))