contrib/revsetbenchmarks.py
author Matt Mackall <mpm@selenic.com>
Fri, 06 May 2016 17:53:06 -0500
branchstable
changeset 29089 222b8170d69e
parent 28564 6d7da0901a28
child 29210 984c4d23d39c
permissions -rwxr-xr-x
progress: stop excessive clearing (issue4801) The progress bar was being cleared on every write(), regardless of whether it was currently displayed. This could foul up the display of any writes that didn't include a linebreak. In particular, the win32 mode of the color extension was turning single prompt string writes into two writes, and the resulting clear/write/clear/write pattern was making the prompt invisible. We fix this by insisting that we have shown a progress bar and haven't just cleared it (setting lastprint to 0). Conveniently, the test suite already had instances of duplicate clears.. that are now cleared up.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20848
11a9393609c8 revsetbenchmark: simplify and convert the script to python
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20847
diff changeset
     1
#!/usr/bin/env python
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
from __future__ import absolute_import, print_function
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    12
import math
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
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    15
import sys
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    16
from subprocess import (
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    17
    CalledProcessError,
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    18
    check_call,
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    19
    PIPE,
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    20
    Popen,
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    21
    STDOUT,
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    22
)
21287
2d93b74335a2 revsetbenchmark: use optparse to retrieve argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21286
diff changeset
    23
# cannot use argparse, python 2.7 only
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    24
from optparse import (
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    25
    OptionParser,
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    26
)
21287
2d93b74335a2 revsetbenchmark: use optparse to retrieve argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21286
diff changeset
    27
25544
e66f1707ba6c revsetbenchmarks: use combination variants in default set
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25543
diff changeset
    28
DEFAULTVARIANTS = ['plain', 'min', 'max', 'first', 'last',
e66f1707ba6c revsetbenchmarks: use combination variants in default set
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25543
diff changeset
    29
                   'reverse', 'reverse+first', 'reverse+last',
e66f1707ba6c revsetbenchmarks: use combination variants in default set
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25543
diff changeset
    30
                   'sort', 'sort+first', 'sort+last']
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
    31
20893
b5de9dde181c revsetbenchmark: remove python 2.7 dependency
Durham Goode <durham@fb.com>
parents: 20855
diff changeset
    32
def check_output(*args, **kwargs):
b5de9dde181c revsetbenchmark: remove python 2.7 dependency
Durham Goode <durham@fb.com>
parents: 20855
diff changeset
    33
    kwargs.setdefault('stderr', PIPE)
b5de9dde181c revsetbenchmark: remove python 2.7 dependency
Durham Goode <durham@fb.com>
parents: 20855
diff changeset
    34
    kwargs.setdefault('stdout', PIPE)
b5de9dde181c revsetbenchmark: remove python 2.7 dependency
Durham Goode <durham@fb.com>
parents: 20855
diff changeset
    35
    proc = Popen(*args, **kwargs)
b5de9dde181c revsetbenchmark: remove python 2.7 dependency
Durham Goode <durham@fb.com>
parents: 20855
diff changeset
    36
    output, error = proc.communicate()
b5de9dde181c revsetbenchmark: remove python 2.7 dependency
Durham Goode <durham@fb.com>
parents: 20855
diff changeset
    37
    if proc.returncode != 0:
21202
c04e5e937139 revsetbenchmark: fix error raising
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20893
diff changeset
    38
        raise CalledProcessError(proc.returncode, ' '.join(args[0]))
20893
b5de9dde181c revsetbenchmark: remove python 2.7 dependency
Durham Goode <durham@fb.com>
parents: 20855
diff changeset
    39
    return output
20848
11a9393609c8 revsetbenchmark: simplify and convert the script to python
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20847
diff changeset
    40
20850
d0c2535c7aba revsetbenchmark: convert update to proper subprocess call
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20849
diff changeset
    41
def update(rev):
d0c2535c7aba revsetbenchmark: convert update to proper subprocess call
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20849
diff changeset
    42
    """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
    43
    try:
d0c2535c7aba revsetbenchmark: convert update to proper subprocess call
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20849
diff changeset
    44
        check_call(['hg', 'update', '--quiet', '--check', str(rev)])
26034
1d829f802fab revsetbenchmarks: run make after update so that C extensions are built
Yuya Nishihara <yuya@tcha.org>
parents: 25660
diff changeset
    45
        check_output(['make', 'local'],
1d829f802fab revsetbenchmarks: run make after update so that C extensions are built
Yuya Nishihara <yuya@tcha.org>
parents: 25660
diff changeset
    46
                     stderr=None)  # suppress output except for error/warning
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25646
diff changeset
    47
    except CalledProcessError as exc:
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    48
        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
    49
        sys.exit(exc.returncode)
d0c2535c7aba revsetbenchmark: convert update to proper subprocess call
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20849
diff changeset
    50
25528
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    51
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    52
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
    53
    """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
    54
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    55
    <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
    56
    <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
    57
    fullcmd = ['./hg']
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    58
    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
    59
        fullcmd += ['-R', repo]
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    60
    fullcmd += ['--config',
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    61
                'extensions.perf=' + os.path.join(contribdir, 'perf.py')]
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    62
    fullcmd += cmd
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    63
    return check_output(fullcmd, stderr=STDOUT)
a6bcd70cd9c2 revsetbenchmarks: extract call to mercurial into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23139
diff changeset
    64
27073
b9fc042168a4 revsetbenchmarks: support benchmarking changectx loading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26781
diff changeset
    65
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
    66
    """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
    67
    try:
27073
b9fc042168a4 revsetbenchmarks: support benchmarking changectx loading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26781
diff changeset
    68
        args = ['perfrevset', revset]
b9fc042168a4 revsetbenchmarks: support benchmarking changectx loading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26781
diff changeset
    69
        if contexts:
b9fc042168a4 revsetbenchmarks: support benchmarking changectx loading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26781
diff changeset
    70
            args.append('--contexts')
b9fc042168a4 revsetbenchmarks: support benchmarking changectx loading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26781
diff changeset
    71
        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
    72
        return parseoutput(output)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25646
diff changeset
    73
    except CalledProcessError as exc:
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    74
        print('abort: cannot run revset benchmark: %s'%exc.cmd, file=sys.stderr)
28073
c4bec3c45ec9 revsetbenchmark: handle exception case
Durham Goode <durham@fb.com>
parents: 27073
diff changeset
    75
        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
    76
            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
    77
        else:
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    78
            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
    79
        return None
20851
4130ec938c84 revsetbenchmark: convert performance call to proper subprocess call
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20850
diff changeset
    80
25530
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
    81
outputre = re.compile(r'! wall (\d+.\d+) comb (\d+.\d+) user (\d+.\d+) '
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
    82
                      'sys (\d+.\d+) \(best of (\d+)\)')
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
    83
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
    84
def parseoutput(output):
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
    85
    """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
    86
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
    87
    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
    88
    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
    89
    """
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
    90
    match = outputre.search(output)
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
    91
    if not match:
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
    92
        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
    93
        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
    94
        sys.exit(1)
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
    95
    return {'comb': float(match.group(2)),
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
    96
            'count': int(match.group(5)),
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
    97
            'sys': float(match.group(3)),
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
    98
            'user': float(match.group(4)),
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
    99
            'wall': float(match.group(1)),
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
20852
b2353501d6dc revsetbenchmark: convert revision display to proper subprocesscall
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20851
diff changeset
   102
def printrevision(rev):
b2353501d6dc revsetbenchmark: convert revision display to proper subprocesscall
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20851
diff changeset
   103
    """print data about a revision"""
25538
caff256205ea revsetbenchmarks: improve revision printing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25537
diff changeset
   104
    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
   105
    sys.stdout.flush()
b2353501d6dc revsetbenchmark: convert revision display to proper subprocesscall
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20851
diff changeset
   106
    check_call(['hg', 'log', '--rev', str(rev), '--template',
25546
59cdf631388b revsetbenchmarks: also display tag when printing a revision
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25544
diff changeset
   107
                '{if(tags, " ({tags})")} '
25538
caff256205ea revsetbenchmarks: improve revision printing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25537
diff changeset
   108
                '{rev}:{node|short}: {desc|firstline}\n'])
20852
b2353501d6dc revsetbenchmark: convert revision display to proper subprocesscall
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20851
diff changeset
   109
25532
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   110
def idxwidth(nbidx):
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   111
    """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
   112
25533
4bdf6f58aee1 revsetbenchmarks: clarify comment based on irc discussion
Augie Fackler <augie@google.com>
parents: 25532
diff changeset
   113
    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
   114
    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
   115
    extra rounding business that log10 would imply.
4bdf6f58aee1 revsetbenchmarks: clarify comment based on irc discussion
Augie Fackler <augie@google.com>
parents: 25532
diff changeset
   116
    """
25532
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   117
    nbidx -= 1 # starts at 0
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   118
    idxwidth = 0
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   119
    while nbidx:
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   120
        idxwidth += 1
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   121
        nbidx //= 10
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   122
    if not idxwidth:
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   123
        idxwidth = 1
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   124
    return idxwidth
1311aee85dcf revsetbenchmarks: ensure all indexes have the same width
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25531
diff changeset
   125
25539
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   126
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
   127
    """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
   128
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26034
diff changeset
   129
    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
   130
    variation)."""
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   131
    factor = 1
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   132
    if main is not None:
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   133
        factor = other[field] / main[field]
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   134
    low, high = 1 - sensitivity, 1 + sensitivity
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   135
    if (low < factor < high):
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   136
        return None
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   137
    return factor
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   138
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   139
def formatfactor(factor):
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   140
    """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
   141
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   142
     22%
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   143
    156%
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   144
    x2.4
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   145
     x23
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   146
    x789
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   147
    x1e4
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   148
    x5x7
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   149
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   150
    """
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   151
    if factor is None:
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   152
        return '    '
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   153
    elif factor < 2:
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   154
        return '%3i%%' % (factor * 100)
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   155
    elif factor < 10:
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   156
        return 'x%3.1f' % factor
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   157
    elif factor < 1000:
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   158
        return '%4s' % ('x%i' % factor)
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   159
    else:
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   160
        order = int(math.log(factor)) + 1
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   161
        while 1 < math.log(factor):
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   162
            factor //= 0
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   163
        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
   164
25541
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   165
def formattiming(value):
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   166
    """format a value to strictly 8 char, dropping some precision if needed"""
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   167
    if value < 10**7:
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   168
        return ('%.6f' % value)[:8]
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   169
    else:
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   170
        # 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
   171
        return '%i' % value
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   172
25539
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   173
_marker = object()
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   174
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
   175
    """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
   176
    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
   177
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   178
    out = []
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   179
    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
   180
        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
   181
            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
   182
            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
   183
            continue
25541
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   184
        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
   185
        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
   186
            factor = None
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   187
            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
   188
                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
   189
            out.append(formatfactor(factor))
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   190
        if verbose:
25541
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   191
            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
   192
            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
   193
            out.append(formattiming(data[var]['sys']))
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   194
            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
   195
    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
   196
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   197
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
   198
    header = [' ' * (idxwidth(maxidx) + 1)]
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   199
    for var in variants:
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   200
        if not var:
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   201
            var = 'iter'
25541
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   202
        if 8 < len(var):
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   203
            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
   204
        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
   205
        if relative:
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   206
            header.append('    ')
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   207
        if verbose:
25541
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   208
            header.append('%-8s' % 'comb')
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   209
            header.append('%-8s' % 'user')
80ce5bce281f revsetbenchmarks: display even more compact timing result
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25540
diff changeset
   210
            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
   211
            header.append('%6s' % 'count')
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   212
    print(' '.join(header))
25530
94efef10b63f revsetbenchmarks: parse perfrevset output into actual number
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25529
diff changeset
   213
20853
95293cf67871 revsetbenchmark: get revision to benchmark in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20852
diff changeset
   214
def getrevs(spec):
95293cf67871 revsetbenchmark: get revision to benchmark in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20852
diff changeset
   215
    """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
   216
    try:
95293cf67871 revsetbenchmark: get revision to benchmark in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20852
diff changeset
   217
        out = check_output(['hg', 'log', '--template={rev}\n', '--rev', spec])
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25646
diff changeset
   218
    except CalledProcessError as exc:
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   219
        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
   220
        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
   221
    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
   222
95293cf67871 revsetbenchmark: get revision to benchmark in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20852
diff changeset
   223
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   224
def applyvariants(revset, variant):
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   225
    if variant == 'plain':
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   226
        return revset
25543
36336cc8cfab revsetbenchmarks: support combining variants with "+"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25542
diff changeset
   227
    for var in variant.split('+'):
36336cc8cfab revsetbenchmarks: support combining variants with "+"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25542
diff changeset
   228
        revset = '%s(%s)' % (var, revset)
36336cc8cfab revsetbenchmarks: support combining variants with "+"
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25542
diff changeset
   229
    return revset
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   230
25607
ddb2a648fdbd revsetbenchmarks: add main documention for the script
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25546
diff changeset
   231
helptext="""This script will run multiple variants of provided revsets using
ddb2a648fdbd revsetbenchmarks: add main documention for the script
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25546
diff changeset
   232
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
   233
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
   234
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
   235
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
   236
comments."""
ddb2a648fdbd revsetbenchmarks: add main documention for the script
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25546
diff changeset
   237
parser = OptionParser(usage="usage: %prog [options] <revs>",
ddb2a648fdbd revsetbenchmarks: add main documention for the script
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25546
diff changeset
   238
                      description=helptext)
21287
2d93b74335a2 revsetbenchmark: use optparse to retrieve argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21286
diff changeset
   239
parser.add_option("-f", "--file",
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 22556
diff changeset
   240
                  help="read revset from FILE (stdin if omitted)",
22555
2143d794e960 revsetbenchmark: make it clear that revsets may be read from stdin
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22059
diff changeset
   241
                  metavar="FILE")
21549
ea3d75ebea6d revsetbenchmark: support for running on other repo
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21548
diff changeset
   242
parser.add_option("-R", "--repo",
ea3d75ebea6d revsetbenchmark: support for running on other repo
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21548
diff changeset
   243
                  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
   244
25537
c1e24e1fd45f revsetbenchmarks: hide most timing under a --verbose flag
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25536
diff changeset
   245
parser.add_option("-v", "--verbose",
c1e24e1fd45f revsetbenchmarks: hide most timing under a --verbose flag
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25536
diff changeset
   246
                  action='store_true',
c1e24e1fd45f revsetbenchmarks: hide most timing under a --verbose flag
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25536
diff changeset
   247
                  help="display all timing data (not just best total time)")
c1e24e1fd45f revsetbenchmarks: hide most timing under a --verbose flag
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25536
diff changeset
   248
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   249
parser.add_option("", "--variants",
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   250
                  default=','.join(DEFAULTVARIANTS),
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   251
                  help="comma separated list of variant to test "
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   252
                       "(eg: plain,min,sorted) (plain = no modification)")
27073
b9fc042168a4 revsetbenchmarks: support benchmarking changectx loading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26781
diff changeset
   253
parser.add_option('', '--contexts',
b9fc042168a4 revsetbenchmarks: support benchmarking changectx loading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26781
diff changeset
   254
                  action='store_true',
b9fc042168a4 revsetbenchmarks: support benchmarking changectx loading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26781
diff changeset
   255
                  help='obtain changectx from results instead of integer revs')
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   256
21287
2d93b74335a2 revsetbenchmark: use optparse to retrieve argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21286
diff changeset
   257
(options, args) = parser.parse_args()
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
   258
25535
6d1e456645c9 revsetbenchmarks: fix argument parsing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25534
diff changeset
   259
if not args:
21287
2d93b74335a2 revsetbenchmark: use optparse to retrieve argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21286
diff changeset
   260
    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
   261
    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
   262
21548
651d7548a744 revsetbenchmark: automatically finds the perf extension
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21287
diff changeset
   263
# 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
   264
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
   265
20848
11a9393609c8 revsetbenchmark: simplify and convert the script to python
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20847
diff changeset
   266
revsetsfile = sys.stdin
21287
2d93b74335a2 revsetbenchmark: use optparse to retrieve argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21286
diff changeset
   267
if options.file:
2d93b74335a2 revsetbenchmark: use optparse to retrieve argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21286
diff changeset
   268
    revsetsfile = open(options.file)
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
   269
22556
480a24ad9f77 revsetbenchmark: allow comments ('#' prefix) in the revset input
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22555
diff changeset
   270
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
   271
revsets = [l for l in revsets if l]
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
   272
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   273
print("Revsets to benchmark")
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   274
print("----------------------------")
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
   275
20848
11a9393609c8 revsetbenchmark: simplify and convert the script to python
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20847
diff changeset
   276
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
   277
    print("%i) %s" % (idx, rset))
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
   278
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   279
print("----------------------------")
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   280
print()
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
   281
25535
6d1e456645c9 revsetbenchmarks: fix argument parsing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25534
diff changeset
   282
revs = []
6d1e456645c9 revsetbenchmarks: fix argument parsing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25534
diff changeset
   283
for a in args:
6d1e456645c9 revsetbenchmarks: fix argument parsing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25534
diff changeset
   284
    revs.extend(getrevs(a))
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
   285
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   286
variants = options.variants.split(',')
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   287
20855
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   288
results = []
20848
11a9393609c8 revsetbenchmark: simplify and convert the script to python
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20847
diff changeset
   289
for r in revs:
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   290
    print("----------------------------")
20852
b2353501d6dc revsetbenchmark: convert revision display to proper subprocesscall
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20851
diff changeset
   291
    printrevision(r)
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   292
    print("----------------------------")
20850
d0c2535c7aba revsetbenchmark: convert update to proper subprocess call
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20849
diff changeset
   293
    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
   294
    res = []
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   295
    results.append(res)
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   296
    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
   297
    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
   298
        varres = {}
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   299
        for var in variants:
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   300
            varrset = applyvariants(rset, var)
27073
b9fc042168a4 revsetbenchmarks: support benchmarking changectx loading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26781
diff changeset
   301
            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
   302
            varres[var] = data
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   303
        res.append(varres)
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   304
        printresult(variants, idx, varres, len(revsets),
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   305
                    verbose=options.verbose)
20855
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   306
        sys.stdout.flush()
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   307
    print("----------------------------")
20745
5fb7c36d751f contrib: added revset performance benchmarking script
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
diff changeset
   308
20855
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   309
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   310
print("""
20855
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   311
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   312
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
   313
================
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   314
""")
20855
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   315
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   316
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
   317
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
   318
    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
   319
    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
   320
    printrevision(rev)
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   321
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   322
print()
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   323
print()
20855
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   324
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   325
for ridx, rset in enumerate(revsets):
dfad9bb23ab4 revsetbenchmark: add a summary at the end of execution
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20854
diff changeset
   326
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   327
    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
   328
    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
   329
    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
   330
    for idx, data in enumerate(results):
25540
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   331
        printresult(variants, idx, data[ridx], len(results),
f08ad5d17e43 revsetbenchmarks: allow running multiple variants per revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25539
diff changeset
   332
                    verbose=options.verbose, reference=ref)
25539
460922c95643 revsetbenchmarks: display relative change when meaningful
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25538
diff changeset
   333
        ref = data[ridx]
28564
6d7da0901a28 contrib: revsetbenchmarks use absolute_import and print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28073
diff changeset
   334
    print()