[Speed] New CPython benchmark suite based on perf

Victor Stinner victor.stinner at gmail.com
Mon Jul 4 11:08:06 EDT 2016


2016-07-04 16:17 GMT+02:00 Victor Stinner <victor.stinner at gmail.com>:
> I modified the CPython benchmark suite to use my perf module:
> https://hg.python.org/sandbox/benchmarks_perf

Hum, you need the development version of perf to test it:

   git clone https://github.com/haypo/perf.git


> Changes:
>
> * replace explicit warmups with perf automatic warmup
> (...)
> * avoid nested loops, prefer a single level of loop: perf is
> responsible to call the sample function enough times to collect enough
> samples

Concrete example with performance/bm_go.py.

Before:
-------------------------
def main(n, timer):
    times = []
    for i in range(5):
        versus_cpu() # warmup
    for i in range(n):
        t1 = timer()
        versus_cpu()
        t2 = timer()
        times.append(t2 - t1)
    return times
-------------------------

After:
-------------------------
def main(loops):
    t0 = perf.perf_counter()

    for _ in xrange(loops):
        versus_cpu()

    return perf.perf_counter() - t0
-------------------------


Example of go benchmark output:
---
$ python3 benchmarks_perf/performance/bm_go.py -v
calibration: 1 loop: 599 ms
calibration: use 1 loop
Run 1/25: warmup (1): 601 ms; raw samples (3): 593 ms, 593 ms, 593 ms
Run 2/25: warmup (1): 609 ms; raw samples (3): 609 ms, 610 ms, 608 ms
Run 3/25: warmup (1): 599 ms; raw samples (3): 598 ms, 606 ms, 598 ms
(...)
Run 25/25: warmup (1): 606 ms; raw samples (3): 591 ms, 590 ms, 591 ms

Median +- std dev: 598 ms +- 8 ms
---

The warmup samples ("warmup (1): ... ms") are not used to compute
median or std dev.



Another example to show fancy features of perf:
---
$ python3 benchmarks_perf/performance/bm_telco.py -v --hist --stats
--metadata -n5 -p50
calibration: 1 loop: 34.6 ms
calibration: 2 loops: 57.8 ms
calibration: 4 loops: 105 ms
calibration: use 4 loops
Run 1/50: warmup (1): 116 ms; raw samples (5): 106 ms, 106 ms, 105 ms,
106 ms, 106 ms
Run 2/50: warmup (1): 107 ms; raw samples (5): 107 ms, 107 ms, 106 ms,
106 ms, 106 ms
Run 3/50: warmup (1): 107 ms; raw samples (5): 106 ms, 106 ms, 106 ms,
106 ms, 106 ms
(...)
Run 50/50: warmup (1): 106 ms; raw samples (5): 104 ms, 105 ms, 105
ms, 106 ms, 105 ms

Metadata:
- aslr: enabled
- cpu_count: 4
- cpu_model_name: Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz
- date: 2016-07-04T17:00:33
- description: Test the performance of the Telco decimal benchmark
- duration: 35.6 sec
- hostname: smithers
- name: telco
- perf_version: 0.6
- platform: Linux-4.5.7-300.fc24.x86_64-x86_64-with-fedora-24-Twenty_Four
- python_executable: /usr/bin/python3
- python_implementation: cpython
- python_version: 3.5.1 (64bit)
- timer: clock_gettime(CLOCK_MONOTONIC), resolution: 1.00 ns

25.8 ms:  1 ##
25.9 ms:  2 #####
26.0 ms:  4 ##########
26.0 ms: 13 ###############################
26.1 ms: 27 #################################################################
26.2 ms: 28 ###################################################################
26.3 ms: 21 ##################################################
26.3 ms: 25 ############################################################
26.4 ms: 32 #############################################################################
26.5 ms: 33 ###############################################################################
26.6 ms: 18 ###########################################
26.6 ms: 13 ###############################
26.7 ms:  8 ###################
26.8 ms:  8 ###################
26.8 ms:  7 #################
26.9 ms:  4 ##########
27.0 ms:  4 ##########
27.1 ms:  1 ##
27.1 ms:  0 |
27.2 ms:  0 |
27.3 ms:  1 ##

Number of samples: 250 (50 runs x 5 samples; 1 warmup)
Standard deviation / median: 1%
Shortest raw sample: 103 ms (4 loops)

Minimum: 25.9 ms (-2.1%)
Median +- std dev: 26.4 ms +- 0.2 ms
Maximum: 27.3 ms (+3.4%)

Median +- std dev: 26.4 ms +- 0.2 ms
---
I used " -n5 -p50" to compute 5 samples per process and use 50
processes. It helps to get a nicer histogram :-) (to have a better
uniform distribution) For histogram, I like using telco because it
generates a regular gaussian curve :-)

Victor


More information about the Speed mailing list