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 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #!/usr/bin/python3
  2. import sys
  3. import random
  4. import time
  5. import warnings
  6. try:
  7. import pyrpn
  8. except (ImportError, NameError) as e:
  9. print("Error importing pyrpn. Try to run make.",
  10. file=sys.stderr)
  11. raise e
  12. #expr_count = 0x200
  13. #max_iter = 0x3000
  14. #argc = 2
  15. #sz = 0x20
  16. expr_count = 5000
  17. max_iter = 0x5000
  18. argc = 2
  19. sz = 0x30
  20. try:
  21. from tqdm import tqdm
  22. tqr = lambda m: tqdm(range(m), unit='expr', unit_scale=True,
  23. #unit_scale=max_iter>>10,
  24. mininterval=.15)
  25. write=False
  26. except (ImportError, NameError) as e:
  27. warnings.warn('tqdm not found')
  28. tqr = range
  29. write=True
  30. if len(sys.argv) > 1:
  31. expr_count = int(sys.argv[1], 0)
  32. if len(sys.argv) > 2:
  33. max_iter = int(sys.argv[2], 0)
  34. if len(sys.argv) > 3:
  35. sz = int(sys.argv[4], 0)
  36. if len(sys.argv) > 4:
  37. argc = int(sys.argv[3], 0)
  38. tot = 0
  39. time_op = 0
  40. start = time.time()
  41. IMAX = (1<<63)-1
  42. samples = 8
  43. print("Running %dK iter on %d expressions with %d op" % (max_iter//1000,
  44. expr_count,
  45. sz))
  46. rnd_samples = [[[random.randint(0, IMAX) for _ in range(argc)] for _ in range(max_iter)]
  47. for _ in range(samples)]
  48. for i in tqr(expr_count):
  49. rnd_expr = pyrpn.random_expr(argc, sz)
  50. all_start = time.time()
  51. expr = pyrpn.RPNExpr(rnd_expr, argc)
  52. start_op = time.time()
  53. rnds = random.choice(rnd_samples)
  54. for rnd in rnds:
  55. expr.eval(*rnd)
  56. time_op += time.time() - start_op
  57. tot += time.time() - all_start
  58. if write:
  59. sys.stderr.write(".")
  60. sys.stderr.flush()
  61. if write:
  62. sys.stderr.write("\n")
  63. total = time.time() - start
  64. print("Runned %dK iter on %d expressions in %.2fs" % (max_iter//1000,
  65. expr_count, total))
  66. msg = "%.1fK iter/s %.1fms per expr (%dK iter, %d op per expr)"
  67. msg %= (max_iter*expr_count/time_op/1000, tot/expr_count*1000,
  68. max_iter//1000, sz)
  69. print(msg)