aboutsummaryrefslogtreecommitdiffstats
path: root/research/experiments/024-finding-items/micro.py
blob: 1e80a9e6e7117197dd4f32b8ce044df9f60a79c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env python3
"""bench-seek before and after prefetch.patch, taking turns five times, lists of 100,000 and 400,000 items:
the median ns of each way and the spread (slowest over fastest), and the load average when it began and ended.

    micro.py DIRECTORY   (holding bench-before and bench-after)"""
import os
import statistics
import subprocess
import sys
from pathlib import Path

here = Path(sys.argv[1])
ways = ['seek', 'seek+3 reads', 'seek+3 reads+3 changes', 'same, a share each 30']
print('load average at the start:', os.getloadavg())
for items in (100000, 400000):
    runs = {'before': [], 'after': []}
    for _ in range(5):
        for version in runs:
            out = subprocess.run([here / f'bench-{version}', str(items), '1500000'], capture_output=True, text=True,
                                 check=True).stdout.splitlines()[:4]
            runs[version].append([float(line.split()[-2]) for line in out])
    for version, measured in runs.items():
        medians = [statistics.median(m[i] for m in measured) for i in range(4)]
        spreads = [max(m[i] for m in measured) / min(m[i] for m in measured) for i in range(4)]
        print(f'{items:>7} {version:<6} ' + '  '.join(f'{w}: {m:.1f} ns (x{s:.2f})' for w, m, s in zip(ways, medians, spreads)))
print('load average at the end:', os.getloadavg())