pyperf icon indicating copy to clipboard operation
pyperf copied to clipboard

Having trouble while using pypy: pyperf is much slower than timeit

Open wangyi041228 opened this issue 3 years ago • 4 comments

I'm learting Python and made some tests. I downloaded and unzipped pypy to a folder. I can't find the proper way to use pyperf with pypy. Can I get the result with JIT?

Code:

# global i, big loop of empty
## pyperf
py -3.10 -m pyperf timeit -s "global i" "for i in range(100_000_000): pass" --rigorous
Mean +- std dev: 1.95 sec +- 0.04 sec

pypy -m pyperf timeit -s "global i" "for i in range(100_000_000): pass" --rigorous
Mean +- std dev: 1.02 sec +- 0.02 sec

### The command
### Can I get the result with JIT?

## timeit
py -3.10 -m timeit -s "global i" "for i in range(100_000_000): pass"
1 loop, best of 5: 2.02 sec per loop

pypy -m timeit -s "global i" "for i in range(100_000_000): pass"
5 loops, average of 7: 46 +- 1.56 msec per loop

pypy --jit off -m timeit -s "global i" "for i in range(100_000_000): pass"
1 loops, average of 7: 6.31 +- 0.0155 sec per loop

wangyi041228 avatar Jul 02 '22 12:07 wangyi041228

You should write the result into a JSON file, and then analyze the data: https://pyperf.readthedocs.io/en/latest/analyze.html

pyperf is now well tuned for JIT compilers. You may have to adjust parameters like --loops and --warmups manually to control if the JIT compiler optimized the code or not.

Measuring performance is a hard problem. Welcome to hell.

vstinner avatar Jul 03 '22 16:07 vstinner

cc @cfbolz @corona10

See also issues like #128

vstinner avatar Jul 03 '22 16:07 vstinner

Thanks for your guide. I'll learn more about Python and hell.

wangyi041228 avatar Jul 03 '22 17:07 wangyi041228

I don't know, it does feel a little bit weird that pyperf gives a result that is a factor of 500x slower than timeit? --loops and --warmups shouldn't really come into it here, because the code that is being measured is a loop with 100 million iterations, so even if perf runs that exactly once, the JIT will compile things.

and if I put that code just directly in a file and run it, it takes about 200ms, just like timeit reports.

but in general @wangyi041228, I would try PyPy on some code that a) is not a test suite and b) not a microbenchmark and c) that you actually care about being fast.

cfbolz avatar Jul 03 '22 17:07 cfbolz