contrib/revsetbenchmarks.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Thu, 07 Nov 2024 01:30:08 +0100
branchstable
changeset 52195 2ff4a2533b92
parent 51703 ca7bde5dbafb
permissions -rwxr-xr-x
test-install: use the global hg for the install step This prevent error in some cases.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45830
c102b704edb5 global: use python3 in shebangs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
     1
#!/usr/bin/env python3
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
     2
20746
47fc466825da contrib: have the revset benchmark test script take a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20745
diff changeset
     3
# Measure the performance of a list of revsets against multiple revisions
47fc466825da contrib: have the revset benchmark test script take a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20745
diff changeset
     4
# defined by parameter. Checkout one by one and run perfrevset with every
47fc466825da contrib: have the revset benchmark test script take a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20745
diff changeset
     5
# revset in the list to benchmark its performance.
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
     6
#
25535
6d1e456645c9 revsetbenchmarks: fix argument parsing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25534
diff changeset
     7
# You should run this from the root of your mercurial repository.
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
     8
#
25535
6d1e456645c9 revsetbenchmarks: fix argument parsing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25534
diff changeset
     9
# call with --help for details
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
    10
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    11
import math
29210
984c4d23d39c py3: make contrib/revsetbenchmarks.py not import symbols from stdlib modules
Yuya Nishihara <yuya@tcha.org>
parents: 28564
diff changeset
    12
import optparse  # cannot use argparse, python 2.7 only
21548
651d7548a744 revsetbenchmark: automatically finds the perf extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21287
diff changeset
    13
import os
25530
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
    14
import re
29210
984c4d23d39c py3: make contrib/revsetbenchmarks.py not import symbols from stdlib modules
Yuya Nishihara <yuya@tcha.org>
parents: 28564
diff changeset
    15
import subprocess
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    16
import sys
21287
2d93b74335a2 revsetbenchmark: use optparse to retrieve argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21286
diff changeset
    17
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    18
DEFAULTVARIANTS = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    19
    'plain',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    20
    'min',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    21
    'max',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    22
    'first',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    23
    'last',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    24
    'reverse',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    25
    'reverse+first',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    26
    'reverse+last',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    27
    'sort',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    28
    'sort+first',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    29
    'sort+last',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    30
]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    31
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
    32
20893
b5de9dde181c revsetbenchmark: remove python 2.7 dependency
Durham Goode <durham@fb.com>
parents: 20855
diff changeset
    33
def check_output(*args, **kwargs):
29210
984c4d23d39c py3: make contrib/revsetbenchmarks.py not import symbols from stdlib modules
Yuya Nishihara <yuya@tcha.org>
parents: 28564
diff changeset
    34
    kwargs.setdefault('stderr', subprocess.PIPE)
984c4d23d39c py3: make contrib/revsetbenchmarks.py not import symbols from stdlib modules
Yuya Nishihara <yuya@tcha.org>
parents: 28564
diff changeset
    35
    kwargs.setdefault('stdout', subprocess.PIPE)
984c4d23d39c py3: make contrib/revsetbenchmarks.py not import symbols from stdlib modules
Yuya Nishihara <yuya@tcha.org>
parents: 28564
diff changeset
    36
    proc = subprocess.Popen(*args, **kwargs)
20893
b5de9dde181c revsetbenchmark: remove python 2.7 dependency
Durham Goode <durham@fb.com>
parents: 20855
diff changeset
    37
    output, error = proc.communicate()
b5de9dde181c revsetbenchmark: remove python 2.7 dependency
Durham Goode <durham@fb.com>
parents: 20855
diff changeset
    38
    if proc.returncode != 0:
29210
984c4d23d39c py3: make contrib/revsetbenchmarks.py not import symbols from stdlib modules
Yuya Nishihara <yuya@tcha.org>
parents: 28564
diff changeset
    39
        raise subprocess.CalledProcessError(proc.returncode, ' '.join(args[0]))
20893
b5de9dde181c revsetbenchmark: remove python 2.7 dependency
Durham Goode <durham@fb.com>
parents: 20855
diff changeset
    40
    return output
20848
11a9393609c8 revsetbenchmark: simplify and convert the script to python
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20847
diff changeset
    41
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    42
20850
d0c2535c7aba revsetbenchmark: convert update to proper subprocess call
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20849
diff changeset
    43
def update(rev):
d0c2535c7aba revsetbenchmark: convert update to proper subprocess call
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20849
diff changeset
    44
    """update the repo to a revision"""
d0c2535c7aba revsetbenchmark: convert update to proper subprocess call
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20849
diff changeset
    45
    try:
29210
984c4d23d39c py3: make contrib/revsetbenchmarks.py not import symbols from stdlib modules
Yuya Nishihara <yuya@tcha.org>
parents: 28564
diff changeset
    46
        subprocess.check_call(['hg', 'update', '--quiet', '--check', str(rev)])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    47
        check_output(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    48
            ['make', 'local'], stderr=None
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    49
        )  # suppress output except for error/warning
29210
984c4d23d39c py3: make contrib/revsetbenchmarks.py not import symbols from stdlib modules
Yuya Nishihara <yuya@tcha.org>
parents: 28564
diff changeset
    50
    except subprocess.CalledProcessError as exc:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    51
        print('update to revision %s failed, aborting' % rev, file=sys.stderr)
20850
d0c2535c7aba revsetbenchmark: convert update to proper subprocess call
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20849
diff changeset
    52
        sys.exit(exc.returncode)
d0c2535c7aba revsetbenchmark: convert update to proper subprocess call
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20849
diff changeset
    53
25528
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    54
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    55
def hg(cmd, repo=None):
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    56
    """run a mercurial command
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    57
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    58
    <cmd> is the list of command + argument,
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    59
    <repo> is an optional repository path to run this command in."""
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    60
    fullcmd = ['./hg']
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    61
    if repo is not None:
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    62
        fullcmd += ['-R', repo]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    63
    fullcmd += [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    64
        '--config',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    65
        'extensions.perf=' + os.path.join(contribdir, 'perf.py'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    66
    ]
25528
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    67
    fullcmd += cmd
29210
984c4d23d39c py3: make contrib/revsetbenchmarks.py not import symbols from stdlib modules
Yuya Nishihara <yuya@tcha.org>
parents: 28564
diff changeset
    68
    return check_output(fullcmd, stderr=subprocess.STDOUT)
25528
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    69
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    70
27073
b9fc042168a4 revsetbenchmarks: support benchmarking changectx loading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26781
diff changeset
    71
def perf(revset, target=None, contexts=False):
20851
4130ec938c84 revsetbenchmark: convert performance call to proper subprocess call
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20850
diff changeset
    72
    """run benchmark for this very revset"""
4130ec938c84 revsetbenchmark: convert performance call to proper subprocess call
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20850
diff changeset
    73
    try:
41272
71ef4e923886 revsetbenchmarks: support revset starting with a "-"
Boris Feld <boris.feld@octobus.net>
parents: 40029
diff changeset
    74
        args = ['perfrevset']
27073
b9fc042168a4 revsetbenchmarks: support benchmarking changectx loading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26781
diff changeset
    75
        if contexts:
b9fc042168a4 revsetbenchmarks: support benchmarking changectx loading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26781
diff changeset
    76
            args.append('--contexts')
41272
71ef4e923886 revsetbenchmarks: support revset starting with a "-"
Boris Feld <boris.feld@octobus.net>
parents: 40029
diff changeset
    77
        args.append('--')
71ef4e923886 revsetbenchmarks: support revset starting with a "-"
Boris Feld <boris.feld@octobus.net>
parents: 40029
diff changeset
    78
        args.append(revset)
27073
b9fc042168a4 revsetbenchmarks: support benchmarking changectx loading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26781
diff changeset
    79
        output = hg(args, repo=target)
25530
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
    80
        return parseoutput(output)
29210
984c4d23d39c py3: make contrib/revsetbenchmarks.py not import symbols from stdlib modules
Yuya Nishihara <yuya@tcha.org>
parents: 28564
diff changeset
    81
    except subprocess.CalledProcessError as exc:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    82
        print(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    83
            'abort: cannot run revset benchmark: %s' % exc.cmd, file=sys.stderr
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    84
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    85
        if getattr(exc, 'output', None) is None:  # no output before 2.7
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    86
            print('(no output)', file=sys.stderr)
25529
3e80691d0dfe revsetbenchmarks: improve error output in case of failure
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25528
diff changeset
    87
        else:
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    88
            print(exc.output, file=sys.stderr)
25646
57e7a060a06f revsetbenchmark: do not abort on failure to run a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25642
diff changeset
    89
        return None
20851
4130ec938c84 revsetbenchmark: convert performance call to proper subprocess call
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20850
diff changeset
    90
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    91
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    92
outputre = re.compile(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    93
    br'! wall (\d+.\d+) comb (\d+.\d+) user (\d+.\d+) '
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    94
    br'sys (\d+.\d+) \(best of (\d+)\)'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    95
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
    96
25530
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
    97
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
    98
def parseoutput(output):
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
    99
    """parse a textual output into a dict
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
   100
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
   101
    We cannot just use json because we want to compare with old
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
   102
    versions of Mercurial that may not support json output.
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
   103
    """
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
   104
    match = outputre.search(output)
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
   105
    if not match:
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   106
        print('abort: invalid output:', file=sys.stderr)
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   107
        print(output, file=sys.stderr)
25530
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
   108
        sys.exit(1)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   109
    return {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   110
        'comb': float(match.group(2)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   111
        'count': int(match.group(5)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   112
        'sys': float(match.group(3)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   113
        'user': float(match.group(4)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   114
        'wall': float(match.group(1)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   115
    }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   116
25530
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
   117
20852
b2353501d6dc revsetbenchmark: convert revision display to proper subprocesscall
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20851
diff changeset
   118
def printrevision(rev):
b2353501d6dc revsetbenchmark: convert revision display to proper subprocesscall
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20851
diff changeset
   119
    """print data about a revision"""
25538
caff256205ea revsetbenchmarks: improve revision printing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25537
diff changeset
   120
    sys.stdout.write("Revision ")
20852
b2353501d6dc revsetbenchmark: convert revision display to proper subprocesscall
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20851
diff changeset
   121
    sys.stdout.flush()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   122
    subprocess.check_call(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   123
        [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   124
            'hg',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   125
            'log',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   126
            '--rev',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   127
            str(rev),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   128
            '--template',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   129
            '{if(tags, " ({tags})")} ' '{rev}:{node|short}: {desc|firstline}\n',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   130
        ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   131
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   132
20852
b2353501d6dc revsetbenchmark: convert revision display to proper subprocesscall
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20851
diff changeset
   133
25532
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   134
def idxwidth(nbidx):
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   135
    """return the max width of number used for index
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   136
25533
4bdf6f58aee1 revsetbenchmarks: clarify comment based on irc discussion
Augie Fackler <augie@google.com>
parents: 25532
diff changeset
   137
    This is similar to log10(nbidx), but we use custom code here
4bdf6f58aee1 revsetbenchmarks: clarify comment based on irc discussion
Augie Fackler <augie@google.com>
parents: 25532
diff changeset
   138
    because we start with zero and we'd rather not deal with all the
4bdf6f58aee1 revsetbenchmarks: clarify comment based on irc discussion
Augie Fackler <augie@google.com>
parents: 25532
diff changeset
   139
    extra rounding business that log10 would imply.
4bdf6f58aee1 revsetbenchmarks: clarify comment based on irc discussion
Augie Fackler <augie@google.com>
parents: 25532
diff changeset
   140
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   141
    nbidx -= 1  # starts at 0
25532
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   142
    idxwidth = 0
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   143
    while nbidx:
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   144
        idxwidth += 1
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   145
        nbidx //= 10
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   146
    if not idxwidth:
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   147
        idxwidth = 1
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   148
    return idxwidth
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   149
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   150
25539
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   151
def getfactor(main, other, field, sensitivity=0.05):
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   152
    """return the relative factor between values for 'field' in main and other
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   153
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26034
diff changeset
   154
    Return None if the factor is insignificant (less than <sensitivity>
25539
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   155
    variation)."""
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   156
    factor = 1
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   157
    if main is not None:
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   158
        factor = other[field] / main[field]
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   159
    low, high = 1 - sensitivity, 1 + sensitivity
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   160
    if low < factor < high:
25539
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   161
        return None
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   162
    return factor
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   163
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   164
25539
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   165
def formatfactor(factor):
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   166
    """format a factor into a 4 char string
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   167
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   168
     22%
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   169
    156%
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   170
    x2.4
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   171
     x23
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   172
    x789
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   173
    x1e4
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   174
    x5x7
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   175
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   176
    """
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   177
    if factor is None:
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   178
        return '    '
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   179
    elif factor < 2:
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   180
        return '%3i%%' % (factor * 100)
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   181
    elif factor < 10:
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   182
        return 'x%3.1f' % factor
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   183
    elif factor < 1000:
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   184
        return '%4s' % ('x%i' % factor)
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   185
    else:
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   186
        order = int(math.log(factor)) + 1
40029
e2697acd9381 cleanup: some Yoda conditions, this patch removes
Martin von Zweigbergk <martinvonz@google.com>
parents: 29210
diff changeset
   187
        while math.log(factor) > 1:
25539
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   188
            factor //= 0
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   189
        return 'x%ix%i' % (factor, order)
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   190
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   191
25541
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   192
def formattiming(value):
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   193
    """format a value to strictly 8 char, dropping some precision if needed"""
51703
ca7bde5dbafb black: format the codebase with 23.3.0
Raphaël Gomès <rgomes@octobus.net>
parents: 51700
diff changeset
   194
    if value < 10**7:
25541
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   195
        return ('%.6f' % value)[:8]
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   196
    else:
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   197
        # value is HUGE very unlikely to happen (4+ month run)
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   198
        return '%i' % value
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   199
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   200
25539
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   201
_marker = object()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   202
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   203
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   204
def printresult(variants, idx, data, maxidx, verbose=False, reference=_marker):
25531
371d8afc9144 revsetbenchmarks: factor out result output into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25530
diff changeset
   205
    """print a line of result to stdout"""
25532
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   206
    mask = '%%0%ii) %%s' % idxwidth(maxidx)
25646
57e7a060a06f revsetbenchmark: do not abort on failure to run a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25642
diff changeset
   207
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   208
    out = []
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   209
    for var in variants:
25646
57e7a060a06f revsetbenchmark: do not abort on failure to run a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25642
diff changeset
   210
        if data[var] is None:
57e7a060a06f revsetbenchmark: do not abort on failure to run a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25642
diff changeset
   211
            out.append('error   ')
57e7a060a06f revsetbenchmark: do not abort on failure to run a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25642
diff changeset
   212
            out.append(' ' * 4)
57e7a060a06f revsetbenchmark: do not abort on failure to run a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25642
diff changeset
   213
            continue
25541
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   214
        out.append(formattiming(data[var]['wall']))
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   215
        if reference is not _marker:
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   216
            factor = None
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   217
            if reference is not None:
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   218
                factor = getfactor(reference[var], data[var], 'wall')
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   219
            out.append(formatfactor(factor))
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   220
        if verbose:
25541
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   221
            out.append(formattiming(data[var]['comb']))
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   222
            out.append(formattiming(data[var]['user']))
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   223
            out.append(formattiming(data[var]['sys']))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   224
            out.append('%6d' % data[var]['count'])
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   225
    print(mask % (idx, ' '.join(out)))
25530
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
   226
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   227
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   228
def printheader(variants, maxidx, verbose=False, relative=False):
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   229
    header = [' ' * (idxwidth(maxidx) + 1)]
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   230
    for var in variants:
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   231
        if not var:
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   232
            var = 'iter'
40029
e2697acd9381 cleanup: some Yoda conditions, this patch removes
Martin von Zweigbergk <martinvonz@google.com>
parents: 29210
diff changeset
   233
        if len(var) > 8:
25541
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   234
            var = var[:3] + '..' + var[-3:]
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   235
        header.append('%-8s' % var)
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   236
        if relative:
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   237
            header.append('    ')
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   238
        if verbose:
25541
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   239
            header.append('%-8s' % 'comb')
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   240
            header.append('%-8s' % 'user')
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   241
            header.append('%-8s' % 'sys')
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   242
            header.append('%6s' % 'count')
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   243
    print(' '.join(header))
25530
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
   244
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   245
20853
95293cf67871 revsetbenchmark: get revision to benchmark in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20852
diff changeset
   246
def getrevs(spec):
95293cf67871 revsetbenchmark: get revision to benchmark in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20852
diff changeset
   247
    """get the list of rev matched by a revset"""
95293cf67871 revsetbenchmark: get revision to benchmark in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20852
diff changeset
   248
    try:
95293cf67871 revsetbenchmark: get revision to benchmark in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20852
diff changeset
   249
        out = check_output(['hg', 'log', '--template={rev}\n', '--rev', spec])
29210
984c4d23d39c py3: make contrib/revsetbenchmarks.py not import symbols from stdlib modules
Yuya Nishihara <yuya@tcha.org>
parents: 28564
diff changeset
   250
    except subprocess.CalledProcessError as exc:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   251
        print("abort, can't get revision from %s" % spec, file=sys.stderr)
20853
95293cf67871 revsetbenchmark: get revision to benchmark in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20852
diff changeset
   252
        sys.exit(exc.returncode)
95293cf67871 revsetbenchmark: get revision to benchmark in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20852
diff changeset
   253
    return [r for r in out.split() if r]
95293cf67871 revsetbenchmark: get revision to benchmark in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20852
diff changeset
   254
95293cf67871 revsetbenchmark: get revision to benchmark in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20852
diff changeset
   255
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   256
def applyvariants(revset, variant):
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   257
    if variant == 'plain':
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   258
        return revset
25543
36336cc8cfab revsetbenchmarks: support combining variants with "+"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25542
diff changeset
   259
    for var in variant.split('+'):
36336cc8cfab revsetbenchmarks: support combining variants with "+"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25542
diff changeset
   260
        revset = '%s(%s)' % (var, revset)
36336cc8cfab revsetbenchmarks: support combining variants with "+"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25542
diff changeset
   261
    return revset
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   262
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   263
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   264
helptext = """This script will run multiple variants of provided revsets using
25607
ddb2a648fdbd revsetbenchmarks: add main documention for the script
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25546
diff changeset
   265
different revisions in your mercurial repository. After the benchmark are run
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26034
diff changeset
   266
summary output is provided. Use it to demonstrate speed improvements or pin
25607
ddb2a648fdbd revsetbenchmarks: add main documention for the script
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25546
diff changeset
   267
point regressions. Revsets to run are specified in a file (or from stdin), one
ddb2a648fdbd revsetbenchmarks: add main documention for the script
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25546
diff changeset
   268
revsets per line. Line starting with '#' will be ignored, allowing insertion of
ddb2a648fdbd revsetbenchmarks: add main documention for the script
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25546
diff changeset
   269
comments."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   270
parser = optparse.OptionParser(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   271
    usage="usage: %prog [options] <revs>", description=helptext
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   272
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   273
parser.add_option(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   274
    "-f",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   275
    "--file",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   276
    help="read revset from FILE (stdin if omitted)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   277
    metavar="FILE",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   278
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   279
parser.add_option("-R", "--repo", help="run benchmark on REPO", metavar="REPO")
21287
2d93b74335a2 revsetbenchmark: use optparse to retrieve argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21286
diff changeset
   280
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   281
parser.add_option(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   282
    "-v",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   283
    "--verbose",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   284
    action='store_true',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   285
    help="display all timing data (not just best total time)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   286
)
25537
c1e24e1fd45f revsetbenchmarks: hide most timing under a --verbose flag
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25536
diff changeset
   287
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   288
parser.add_option(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   289
    "",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   290
    "--variants",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   291
    default=','.join(DEFAULTVARIANTS),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   292
    help="comma separated list of variant to test "
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   293
    "(eg: plain,min,sorted) (plain = no modification)",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   294
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   295
parser.add_option(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   296
    '',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   297
    '--contexts',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   298
    action='store_true',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   299
    help='obtain changectx from results instead of integer revs',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   300
)
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   301
21287
2d93b74335a2 revsetbenchmark: use optparse to retrieve argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21286
diff changeset
   302
(options, args) = parser.parse_args()
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
   303
25535
6d1e456645c9 revsetbenchmarks: fix argument parsing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25534
diff changeset
   304
if not args:
21287
2d93b74335a2 revsetbenchmark: use optparse to retrieve argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21286
diff changeset
   305
    parser.print_help()
21286
f0f810096842 revsetbenchmark: add a usage message when no arguments are passed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21202
diff changeset
   306
    sys.exit(255)
f0f810096842 revsetbenchmark: add a usage message when no arguments are passed
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21202
diff changeset
   307
21548
651d7548a744 revsetbenchmark: automatically finds the perf extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21287
diff changeset
   308
# the directory where both this script and the perf.py extension live.
651d7548a744 revsetbenchmark: automatically finds the perf extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21287
diff changeset
   309
contribdir = os.path.dirname(__file__)
21287
2d93b74335a2 revsetbenchmark: use optparse to retrieve argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21286
diff changeset
   310
20848
11a9393609c8 revsetbenchmark: simplify and convert the script to python
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20847
diff changeset
   311
revsetsfile = sys.stdin
21287
2d93b74335a2 revsetbenchmark: use optparse to retrieve argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21286
diff changeset
   312
if options.file:
2d93b74335a2 revsetbenchmark: use optparse to retrieve argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21286
diff changeset
   313
    revsetsfile = open(options.file)
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
   314
22556
480a24ad9f77 revsetbenchmark: allow comments ('#' prefix) in the revset input
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22555
diff changeset
   315
revsets = [l.strip() for l in revsetsfile if not l.startswith('#')]
25642
5265932aad83 revsetbenchmarks: ignore empty lines
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25607
diff changeset
   316
revsets = [l for l in revsets if l]
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
   317
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   318
print("Revsets to benchmark")
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   319
print("----------------------------")
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
   320
20848
11a9393609c8 revsetbenchmark: simplify and convert the script to python
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20847
diff changeset
   321
for idx, rset in enumerate(revsets):
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   322
    print("%i) %s" % (idx, rset))
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
   323
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   324
print("----------------------------")
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   325
print()
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
   326
25535
6d1e456645c9 revsetbenchmarks: fix argument parsing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25534
diff changeset
   327
revs = []
6d1e456645c9 revsetbenchmarks: fix argument parsing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25534
diff changeset
   328
for a in args:
6d1e456645c9 revsetbenchmarks: fix argument parsing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25534
diff changeset
   329
    revs.extend(getrevs(a))
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
   330
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   331
variants = options.variants.split(',')
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   332
20855
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   333
results = []
20848
11a9393609c8 revsetbenchmark: simplify and convert the script to python
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20847
diff changeset
   334
for r in revs:
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   335
    print("----------------------------")
20852
b2353501d6dc revsetbenchmark: convert revision display to proper subprocesscall
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20851
diff changeset
   336
    printrevision(r)
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   337
    print("----------------------------")
20850
d0c2535c7aba revsetbenchmark: convert update to proper subprocess call
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20849
diff changeset
   338
    update(r)
20855
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   339
    res = []
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   340
    results.append(res)
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   341
    printheader(variants, len(revsets), verbose=options.verbose)
20848
11a9393609c8 revsetbenchmark: simplify and convert the script to python
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20847
diff changeset
   342
    for idx, rset in enumerate(revsets):
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   343
        varres = {}
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   344
        for var in variants:
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   345
            varrset = applyvariants(rset, var)
27073
b9fc042168a4 revsetbenchmarks: support benchmarking changectx loading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26781
diff changeset
   346
            data = perf(varrset, target=options.repo, contexts=options.contexts)
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   347
            varres[var] = data
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   348
        res.append(varres)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   349
        printresult(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   350
            variants, idx, varres, len(revsets), verbose=options.verbose
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   351
        )
20855
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   352
        sys.stdout.flush()
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   353
    print("----------------------------")
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
   354
20855
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   355
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   356
print(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   357
    """
20855
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   358
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   359
Result by revset
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   360
================
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   361
"""
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   362
)
20855
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   363
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   364
print('Revision:')
20855
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   365
for idx, rev in enumerate(revs):
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   366
    sys.stdout.write('%i) ' % idx)
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   367
    sys.stdout.flush()
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   368
    printrevision(rev)
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   369
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   370
print()
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   371
print()
20855
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   372
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   373
for ridx, rset in enumerate(revsets):
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   374
    print("revset #%i: %s" % (ridx, rset))
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   375
    printheader(variants, len(results), verbose=options.verbose, relative=True)
25539
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   376
    ref = None
20855
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   377
    for idx, data in enumerate(results):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   378
        printresult(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   379
            variants,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   380
            idx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   381
            data[ridx],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   382
            len(results),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   383
            verbose=options.verbose,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   384
            reference=ref,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41545
diff changeset
   385
        )
25539
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   386
        ref = data[ridx]
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   387
    print()