contrib/perf.py
author Raphaël Gomès <rgomes@octobus.net>
Mon, 07 Aug 2023 11:08:00 +0200
changeset 50846 3ccef7902070
parent 50839 cf0502231d56
parent 50762 d2f72f702de2
child 50998 12c308c55e53
permissions -rw-r--r--
branching: merge stable into default
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     1
# perf.py - performance test routines
42015
dbca2e5563c3 perf: document config options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41663
diff changeset
     2
'''helper extension to measure performance
dbca2e5563c3 perf: document config options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41663
diff changeset
     3
dbca2e5563c3 perf: document config options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41663
diff changeset
     4
Configurations
dbca2e5563c3 perf: document config options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41663
diff changeset
     5
==============
dbca2e5563c3 perf: document config options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41663
diff changeset
     6
dbca2e5563c3 perf: document config options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41663
diff changeset
     7
``perf``
dbca2e5563c3 perf: document config options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41663
diff changeset
     8
--------
dbca2e5563c3 perf: document config options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41663
diff changeset
     9
dbca2e5563c3 perf: document config options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41663
diff changeset
    10
``all-timing``
42021
4c700c847aa2 perf: copyedit a few documentation strings
Augie Fackler <augie@google.com>
parents: 42019
diff changeset
    11
    When set, additional statistics will be reported for each benchmark: best,
42015
dbca2e5563c3 perf: document config options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41663
diff changeset
    12
    worst, median average. If not set only the best timing is reported
dbca2e5563c3 perf: document config options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41663
diff changeset
    13
    (default: off).
dbca2e5563c3 perf: document config options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41663
diff changeset
    14
dbca2e5563c3 perf: document config options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41663
diff changeset
    15
``presleep``
42021
4c700c847aa2 perf: copyedit a few documentation strings
Augie Fackler <augie@google.com>
parents: 42019
diff changeset
    16
  number of second to wait before any group of runs (default: 1)
42015
dbca2e5563c3 perf: document config options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41663
diff changeset
    17
42381
563cd9a72682 perf: add a `pre-run` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
    18
``pre-run``
563cd9a72682 perf: add a `pre-run` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
    19
  number of run to perform before starting measurement.
563cd9a72682 perf: add a `pre-run` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
    20
42382
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
    21
``profile-benchmark``
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
    22
  Enable profiling for the benchmarked section.
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
    23
  (The first iteration is benchmarked)
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
    24
42019
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
    25
``run-limits``
42021
4c700c847aa2 perf: copyedit a few documentation strings
Augie Fackler <augie@google.com>
parents: 42019
diff changeset
    26
  Control the number of runs each benchmark will perform. The option value
42019
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
    27
  should be a list of `<time>-<numberofrun>` pairs. After each run the
42021
4c700c847aa2 perf: copyedit a few documentation strings
Augie Fackler <augie@google.com>
parents: 42019
diff changeset
    28
  conditions are considered in order with the following logic:
4c700c847aa2 perf: copyedit a few documentation strings
Augie Fackler <augie@google.com>
parents: 42019
diff changeset
    29
4c700c847aa2 perf: copyedit a few documentation strings
Augie Fackler <augie@google.com>
parents: 42019
diff changeset
    30
      If benchmark has been running for <time> seconds, and we have performed
42019
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
    31
      <numberofrun> iterations, stop the benchmark,
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
    32
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
    33
  The default value is: `3.0-100, 10.0-3`
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
    34
42015
dbca2e5563c3 perf: document config options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41663
diff changeset
    35
``stub``
42021
4c700c847aa2 perf: copyedit a few documentation strings
Augie Fackler <augie@google.com>
parents: 42019
diff changeset
    36
    When set, benchmarks will only be run once, useful for testing
4c700c847aa2 perf: copyedit a few documentation strings
Augie Fackler <augie@google.com>
parents: 42019
diff changeset
    37
    (default: off)
42015
dbca2e5563c3 perf: document config options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41663
diff changeset
    38
'''
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    39
29493
4533f5b47949 perf: add historical portability policy for future reference
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28561
diff changeset
    40
# "historical portability" policy of perf.py:
4533f5b47949 perf: add historical portability policy for future reference
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28561
diff changeset
    41
#
4533f5b47949 perf: add historical portability policy for future reference
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28561
diff changeset
    42
# We have to do:
4533f5b47949 perf: add historical portability policy for future reference
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28561
diff changeset
    43
# - make perf.py "loadable" with as wide Mercurial version as possible
4533f5b47949 perf: add historical portability policy for future reference
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28561
diff changeset
    44
#   This doesn't mean that perf commands work correctly with that Mercurial.
4533f5b47949 perf: add historical portability policy for future reference
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28561
diff changeset
    45
#   BTW, perf.py itself has been available since 1.1 (or eb240755386d).
4533f5b47949 perf: add historical portability policy for future reference
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28561
diff changeset
    46
# - make historical perf command work correctly with as wide Mercurial
4533f5b47949 perf: add historical portability policy for future reference
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28561
diff changeset
    47
#   version as possible
4533f5b47949 perf: add historical portability policy for future reference
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28561
diff changeset
    48
#
4533f5b47949 perf: add historical portability policy for future reference
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28561
diff changeset
    49
# We have to do, if possible with reasonable cost:
4533f5b47949 perf: add historical portability policy for future reference
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28561
diff changeset
    50
# - make recent perf command for historical feature work correctly
4533f5b47949 perf: add historical portability policy for future reference
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28561
diff changeset
    51
#   with early Mercurial
4533f5b47949 perf: add historical portability policy for future reference
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28561
diff changeset
    52
#
4533f5b47949 perf: add historical portability policy for future reference
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28561
diff changeset
    53
# We don't have to do:
4533f5b47949 perf: add historical portability policy for future reference
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28561
diff changeset
    54
# - make perf command for recent feature work correctly with early
4533f5b47949 perf: add historical portability policy for future reference
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28561
diff changeset
    55
#   Mercurial
4533f5b47949 perf: add historical portability policy for future reference
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28561
diff changeset
    56
40144
acf560bc9b56 perf: extract the timing of a section in a context manager
Boris Feld <boris.feld@octobus.net>
parents: 40143
diff changeset
    57
import contextlib
28561
330584235c22 contrib: make perf.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27649
diff changeset
    58
import functools
31406
8f5ed8fa39f8 perf: perform a garbage collection before each iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30997
diff changeset
    59
import gc
28561
330584235c22 contrib: make perf.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27649
diff changeset
    60
import os
27286
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
    61
import random
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
    62
import shutil
32565
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
    63
import struct
28561
330584235c22 contrib: make perf.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27649
diff changeset
    64
import sys
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
    65
import tempfile
35599
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
    66
import threading
28561
330584235c22 contrib: make perf.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27649
diff changeset
    67
import time
47089
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
    68
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
    69
import mercurial.revlog
28561
330584235c22 contrib: make perf.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27649
diff changeset
    70
from mercurial import (
30020
bd6df07ccc24 perf: add perfchangegroupchangelog command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30019
diff changeset
    71
    changegroup,
28561
330584235c22 contrib: make perf.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27649
diff changeset
    72
    cmdutil,
330584235c22 contrib: make perf.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27649
diff changeset
    73
    commands,
330584235c22 contrib: make perf.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27649
diff changeset
    74
    copies,
330584235c22 contrib: make perf.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27649
diff changeset
    75
    error,
29495
f83445296213 perf: use locally defined revlog option list for Mercurial earlier than 3.7
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29494
diff changeset
    76
    extensions,
40954
db6cace18765 perfdiscovery: benching findcommonheads()
Georges Racinet <gracinet@anybox.fr>
parents: 40943
diff changeset
    77
    hg,
28561
330584235c22 contrib: make perf.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27649
diff changeset
    78
    mdiff,
330584235c22 contrib: make perf.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27649
diff changeset
    79
    merge,
330584235c22 contrib: make perf.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27649
diff changeset
    80
    util,
330584235c22 contrib: make perf.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27649
diff changeset
    81
)
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    82
29494
3b5389ef5cfe perf: define util.safehasattr forcibly for Mercurial earlier than 1.9.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29493
diff changeset
    83
# for "historical portability":
29567
7e2b389418da perf: import newer modules separately for earlier Mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29497
diff changeset
    84
# try to import modules separately (in dict order), and ignore
7e2b389418da perf: import newer modules separately for earlier Mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29497
diff changeset
    85
# failure, because these aren't available with early Mercurial
7e2b389418da perf: import newer modules separately for earlier Mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29497
diff changeset
    86
try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
    87
    from mercurial import branchmap  # since 2.5 (or bcee63733aad)
29567
7e2b389418da perf: import newer modules separately for earlier Mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29497
diff changeset
    88
except ImportError:
7e2b389418da perf: import newer modules separately for earlier Mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29497
diff changeset
    89
    pass
7e2b389418da perf: import newer modules separately for earlier Mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29497
diff changeset
    90
try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
    91
    from mercurial import obsolete  # since 2.3 (or ad0d6c2b3279)
29567
7e2b389418da perf: import newer modules separately for earlier Mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29497
diff changeset
    92
except ImportError:
7e2b389418da perf: import newer modules separately for earlier Mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29497
diff changeset
    93
    pass
7e2b389418da perf: import newer modules separately for earlier Mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29497
diff changeset
    94
try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
    95
    from mercurial import registrar  # since 3.7 (or 37d50250b696)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
    96
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
    97
    dir(registrar)  # forcibly load it
32376
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32337
diff changeset
    98
except ImportError:
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32337
diff changeset
    99
    registrar = None
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32337
diff changeset
   100
try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   101
    from mercurial import repoview  # since 2.5 (or 3a6ddacb7198)
29567
7e2b389418da perf: import newer modules separately for earlier Mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29497
diff changeset
   102
except ImportError:
7e2b389418da perf: import newer modules separately for earlier Mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29497
diff changeset
   103
    pass
7e2b389418da perf: import newer modules separately for earlier Mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29497
diff changeset
   104
try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   105
    from mercurial.utils import repoviewutil  # since 5.0
42138
caebe5e7f4bd repoview: move subsettable in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42063
diff changeset
   106
except ImportError:
caebe5e7f4bd repoview: move subsettable in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42063
diff changeset
   107
    repoviewutil = None
caebe5e7f4bd repoview: move subsettable in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42063
diff changeset
   108
try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   109
    from mercurial import scmutil  # since 1.9 (or 8b252e826c68)
29567
7e2b389418da perf: import newer modules separately for earlier Mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29497
diff changeset
   110
except ImportError:
7e2b389418da perf: import newer modules separately for earlier Mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29497
diff changeset
   111
    pass
40954
db6cace18765 perfdiscovery: benching findcommonheads()
Georges Racinet <gracinet@anybox.fr>
parents: 40943
diff changeset
   112
try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   113
    from mercurial import setdiscovery  # since 1.9 (or cb98fed52495)
40954
db6cace18765 perfdiscovery: benching findcommonheads()
Georges Racinet <gracinet@anybox.fr>
parents: 40943
diff changeset
   114
except ImportError:
db6cace18765 perfdiscovery: benching findcommonheads()
Georges Racinet <gracinet@anybox.fr>
parents: 40943
diff changeset
   115
    pass
db6cace18765 perfdiscovery: benching findcommonheads()
Georges Racinet <gracinet@anybox.fr>
parents: 40943
diff changeset
   116
42382
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
   117
try:
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
   118
    from mercurial import profiling
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
   119
except ImportError:
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
   120
    profiling = None
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
   121
47089
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
   122
try:
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
   123
    from mercurial.revlogutils import constants as revlog_constants
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
   124
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
   125
    perf_rl_kind = (revlog_constants.KIND_OTHER, b'created-by-perf')
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
   126
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
   127
    def revlog(opener, *args, **kwargs):
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
   128
        return mercurial.revlog.revlog(opener, perf_rl_kind, *args, **kwargs)
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
   129
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
   130
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
   131
except (ImportError, AttributeError):
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
   132
    perf_rl_kind = None
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
   133
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
   134
    def revlog(opener, *args, **kwargs):
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
   135
        return mercurial.revlog.revlog(opener, *args, **kwargs)
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
   136
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   137
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
   138
def identity(a):
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
   139
    return a
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
   140
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   141
36216
646002338365 py3: introduce and use pycompat.getargspec
Augie Fackler <augie@google.com>
parents: 35990
diff changeset
   142
try:
646002338365 py3: introduce and use pycompat.getargspec
Augie Fackler <augie@google.com>
parents: 35990
diff changeset
   143
    from mercurial import pycompat
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   144
36216
646002338365 py3: introduce and use pycompat.getargspec
Augie Fackler <augie@google.com>
parents: 35990
diff changeset
   145
    getargspec = pycompat.getargspec  # added to module after 4.5
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
   146
    _byteskwargs = pycompat.byteskwargs  # since 4.1 (or fbc3f73dc802)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   147
    _sysstr = pycompat.sysstr  # since 4.0 (or 2219f4f82ede)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   148
    _bytestr = pycompat.bytestr  # since 4.2 (or b70407bd84d5)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   149
    _xrange = pycompat.xrange  # since 4.8 (or 7eba8f83129b)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   150
    fsencode = pycompat.fsencode  # since 3.9 (or f4a5e0e86a7e)
39828
c4ab9fa81377 py3: work around the lack of sys.maxint in contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39827
diff changeset
   151
    if pycompat.ispy3:
c4ab9fa81377 py3: work around the lack of sys.maxint in contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39827
diff changeset
   152
        _maxint = sys.maxsize  # per py3 docs for replacing maxint
c4ab9fa81377 py3: work around the lack of sys.maxint in contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39827
diff changeset
   153
    else:
c4ab9fa81377 py3: work around the lack of sys.maxint in contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39827
diff changeset
   154
        _maxint = sys.maxint
42799
c8d3af9c7e65 perf: handle NameError for `pycompat.foo` when pycompat wasn't imported
Martin von Zweigbergk <martinvonz@google.com>
parents: 42776
diff changeset
   155
except (NameError, ImportError, AttributeError):
36216
646002338365 py3: introduce and use pycompat.getargspec
Augie Fackler <augie@google.com>
parents: 35990
diff changeset
   156
    import inspect
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   157
36216
646002338365 py3: introduce and use pycompat.getargspec
Augie Fackler <augie@google.com>
parents: 35990
diff changeset
   158
    getargspec = inspect.getargspec
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
   159
    _byteskwargs = identity
42801
c00005975c91 perf: don't depend on pycompat for older Mercurial versions
Martin von Zweigbergk <martinvonz@google.com>
parents: 42800
diff changeset
   160
    _bytestr = str
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   161
    fsencode = identity  # no py3 support
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   162
    _maxint = sys.maxint  # no py3 support
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   163
    _sysstr = lambda x: x  # no py3 support
39827
86dbeb7c9a11 py3: switch contrib/perf from xrange to pycompat.xrange
Matt Harbison <matt_harbison@yahoo.com>
parents: 39826
diff changeset
   164
    _xrange = xrange
29567
7e2b389418da perf: import newer modules separately for earlier Mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29497
diff changeset
   165
37890
8fb9985382be pycompat: export queue module instead of symbols in module (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37355
diff changeset
   166
try:
8fb9985382be pycompat: export queue module instead of symbols in module (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37355
diff changeset
   167
    # 4.7+
8fb9985382be pycompat: export queue module instead of symbols in module (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37355
diff changeset
   168
    queue = pycompat.queue.Queue
42799
c8d3af9c7e65 perf: handle NameError for `pycompat.foo` when pycompat wasn't imported
Martin von Zweigbergk <martinvonz@google.com>
parents: 42776
diff changeset
   169
except (NameError, AttributeError, ImportError):
37890
8fb9985382be pycompat: export queue module instead of symbols in module (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37355
diff changeset
   170
    # <4.7.
8fb9985382be pycompat: export queue module instead of symbols in module (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37355
diff changeset
   171
    try:
8fb9985382be pycompat: export queue module instead of symbols in module (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37355
diff changeset
   172
        queue = pycompat.queue
42799
c8d3af9c7e65 perf: handle NameError for `pycompat.foo` when pycompat wasn't imported
Martin von Zweigbergk <martinvonz@google.com>
parents: 42776
diff changeset
   173
    except (NameError, AttributeError, ImportError):
42800
777a9df5a1ef perf: don't try to call `util.queue` on Mercurial version before it existed
Martin von Zweigbergk <martinvonz@google.com>
parents: 42799
diff changeset
   174
        import Queue as queue
37890
8fb9985382be pycompat: export queue module instead of symbols in module (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37355
diff changeset
   175
38269
a577a199983c perftemplating: stop going through the log command
Boris Feld <boris.feld@octobus.net>
parents: 38268
diff changeset
   176
try:
a577a199983c perftemplating: stop going through the log command
Boris Feld <boris.feld@octobus.net>
parents: 38268
diff changeset
   177
    from mercurial import logcmdutil
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   178
38269
a577a199983c perftemplating: stop going through the log command
Boris Feld <boris.feld@octobus.net>
parents: 38268
diff changeset
   179
    makelogtemplater = logcmdutil.maketemplater
a577a199983c perftemplating: stop going through the log command
Boris Feld <boris.feld@octobus.net>
parents: 38268
diff changeset
   180
except (AttributeError, ImportError):
a577a199983c perftemplating: stop going through the log command
Boris Feld <boris.feld@octobus.net>
parents: 38268
diff changeset
   181
    try:
a577a199983c perftemplating: stop going through the log command
Boris Feld <boris.feld@octobus.net>
parents: 38268
diff changeset
   182
        makelogtemplater = cmdutil.makelogtemplater
a577a199983c perftemplating: stop going through the log command
Boris Feld <boris.feld@octobus.net>
parents: 38268
diff changeset
   183
    except (AttributeError, ImportError):
a577a199983c perftemplating: stop going through the log command
Boris Feld <boris.feld@octobus.net>
parents: 38268
diff changeset
   184
        makelogtemplater = None
a577a199983c perftemplating: stop going through the log command
Boris Feld <boris.feld@octobus.net>
parents: 38268
diff changeset
   185
29567
7e2b389418da perf: import newer modules separately for earlier Mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29497
diff changeset
   186
# for "historical portability":
29494
3b5389ef5cfe perf: define util.safehasattr forcibly for Mercurial earlier than 1.9.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29493
diff changeset
   187
# define util.safehasattr forcibly, because util.safehasattr has been
3b5389ef5cfe perf: define util.safehasattr forcibly for Mercurial earlier than 1.9.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29493
diff changeset
   188
# available since 1.9.3 (or 94b200a11cf7)
3b5389ef5cfe perf: define util.safehasattr forcibly for Mercurial earlier than 1.9.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29493
diff changeset
   189
_undefined = object()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   190
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   191
29494
3b5389ef5cfe perf: define util.safehasattr forcibly for Mercurial earlier than 1.9.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29493
diff changeset
   192
def safehasattr(thing, attr):
39826
6787dc1b93a9 py3: handle sysstr conversion around get/set attr in contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39779
diff changeset
   193
    return getattr(thing, _sysstr(attr), _undefined) is not _undefined
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   194
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   195
29494
3b5389ef5cfe perf: define util.safehasattr forcibly for Mercurial earlier than 1.9.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29493
diff changeset
   196
setattr(util, 'safehasattr', safehasattr)
3b5389ef5cfe perf: define util.safehasattr forcibly for Mercurial earlier than 1.9.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29493
diff changeset
   197
29496
7299370cf304 perf: avoid using formatteropts for Mercurial earlier than 3.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29495
diff changeset
   198
# for "historical portability":
31823
f6d77af84ef3 perf: add historical portability for util.timer
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 31483
diff changeset
   199
# define util.timer forcibly, because util.timer has been available
f6d77af84ef3 perf: add historical portability for util.timer
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 31483
diff changeset
   200
# since ae5d60bb70c9
f6d77af84ef3 perf: add historical portability for util.timer
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 31483
diff changeset
   201
if safehasattr(time, 'perf_counter'):
f6d77af84ef3 perf: add historical portability for util.timer
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 31483
diff changeset
   202
    util.timer = time.perf_counter
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   203
elif os.name == b'nt':
31823
f6d77af84ef3 perf: add historical portability for util.timer
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 31483
diff changeset
   204
    util.timer = time.clock
f6d77af84ef3 perf: add historical portability for util.timer
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 31483
diff changeset
   205
else:
f6d77af84ef3 perf: add historical portability for util.timer
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 31483
diff changeset
   206
    util.timer = time.time
f6d77af84ef3 perf: add historical portability for util.timer
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 31483
diff changeset
   207
f6d77af84ef3 perf: add historical portability for util.timer
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 31483
diff changeset
   208
# for "historical portability":
29496
7299370cf304 perf: avoid using formatteropts for Mercurial earlier than 3.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29495
diff changeset
   209
# use locally defined empty option list, if formatteropts isn't
7299370cf304 perf: avoid using formatteropts for Mercurial earlier than 3.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29495
diff changeset
   210
# available, because commands.formatteropts has been available since
7299370cf304 perf: avoid using formatteropts for Mercurial earlier than 3.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29495
diff changeset
   211
# 3.2 (or 7a7eed5176a4), even though formatting itself has been
7299370cf304 perf: avoid using formatteropts for Mercurial earlier than 3.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29495
diff changeset
   212
# available since 2.2 (or ae5f92e154d3)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   213
formatteropts = getattr(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   214
    cmdutil, "formatteropts", getattr(commands, "formatteropts", [])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   215
)
29495
f83445296213 perf: use locally defined revlog option list for Mercurial earlier than 3.7
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29494
diff changeset
   216
f83445296213 perf: use locally defined revlog option list for Mercurial earlier than 3.7
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29494
diff changeset
   217
# for "historical portability":
f83445296213 perf: use locally defined revlog option list for Mercurial earlier than 3.7
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29494
diff changeset
   218
# use locally defined option list, if debugrevlogopts isn't available,
f83445296213 perf: use locally defined revlog option list for Mercurial earlier than 3.7
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29494
diff changeset
   219
# because commands.debugrevlogopts has been available since 3.7 (or
f83445296213 perf: use locally defined revlog option list for Mercurial earlier than 3.7
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29494
diff changeset
   220
# 5606f7d0d063), even though cmdutil.openrevlog() has been available
f83445296213 perf: use locally defined revlog option list for Mercurial earlier than 3.7
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29494
diff changeset
   221
# since 1.9 (or a79fea6b3e77).
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   222
revlogopts = getattr(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   223
    cmdutil,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   224
    "debugrevlogopts",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   225
    getattr(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   226
        commands,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   227
        "debugrevlogopts",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   228
        [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   229
            (b'c', b'changelog', False, b'open changelog'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   230
            (b'm', b'manifest', False, b'open manifest'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   231
            (b'', b'dir', False, b'open directory manifest'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   232
        ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   233
    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   234
)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
   235
18237
4132dc9bd5c4 perftest: migrate to new style command declaration
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18236
diff changeset
   236
cmdtable = {}
29497
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   237
50064
e859f440daa9 locking: grab the wlock before touching the dirstate in `perfdirstatewrite`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49849
diff changeset
   238
29497
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   239
# for "historical portability":
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   240
# define parsealiases locally, because cmdutil.parsealiases has been
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   241
# available since 1.5 (or 6252852b4332)
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   242
def parsealiases(cmd):
40295
fa88170c10bb help: adding a proper declaration for shortlist/basic commands (API)
Rodrigo Damazio <rdamazio@google.com>
parents: 40214
diff changeset
   243
    return cmd.split(b"|")
29497
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   244
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   245
32376
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32337
diff changeset
   246
if safehasattr(registrar, 'command'):
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32337
diff changeset
   247
    command = registrar.command(cmdtable)
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32337
diff changeset
   248
elif safehasattr(cmdutil, 'command'):
29497
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   249
    command = cmdutil.command(cmdtable)
45635
7d0e54056586 py3: use native string when comparing with a function's argspec
Raphaël Gomès <rgomes@octobus.net>
parents: 45016
diff changeset
   250
    if 'norepo' not in getargspec(command).args:
29497
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   251
        # for "historical portability":
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   252
        # wrap original cmdutil.command, because "norepo" option has
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   253
        # been available since 3.1 (or 75a96326cecb)
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   254
        _command = command
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   255
29497
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   256
        def command(name, options=(), synopsis=None, norepo=False):
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   257
            if norepo:
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   258
                commands.norepo += b' %s' % b' '.join(parsealiases(name))
29497
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   259
            return _command(name, list(options), synopsis)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   260
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   261
29497
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   262
else:
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   263
    # for "historical portability":
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   264
    # define "@command" annotation locally, because cmdutil.command
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   265
    # has been available since 1.9 (or 2daa5179e73f)
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   266
    def command(name, options=(), synopsis=None, norepo=False):
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   267
        def decorator(func):
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   268
            if synopsis:
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   269
                cmdtable[name] = func, list(options), synopsis
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   270
            else:
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   271
                cmdtable[name] = func, list(options)
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   272
            if norepo:
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   273
                commands.norepo += b' %s' % b' '.join(parsealiases(name))
29497
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   274
            return func
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   275
29497
ee2027195847 perf: define command annotation locally for Mercurial earlier than 3.1
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29496
diff changeset
   276
        return decorator
18237
4132dc9bd5c4 perftest: migrate to new style command declaration
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18236
diff changeset
   277
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   278
34494
bbb5687e5140 configitems: register the 'perf.stub' config
Boris Feld <boris.feld@octobus.net>
parents: 34350
diff changeset
   279
try:
34749
acdc574cb8d7 contrib-perf: update the config registration
Boris Feld <boris.feld@octobus.net>
parents: 34678
diff changeset
   280
    import mercurial.registrar
acdc574cb8d7 contrib-perf: update the config registration
Boris Feld <boris.feld@octobus.net>
parents: 34678
diff changeset
   281
    import mercurial.configitems
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   282
34494
bbb5687e5140 configitems: register the 'perf.stub' config
Boris Feld <boris.feld@octobus.net>
parents: 34350
diff changeset
   283
    configtable = {}
34749
acdc574cb8d7 contrib-perf: update the config registration
Boris Feld <boris.feld@octobus.net>
parents: 34678
diff changeset
   284
    configitem = mercurial.registrar.configitem(configtable)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   285
    configitem(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   286
        b'perf',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   287
        b'presleep',
34749
acdc574cb8d7 contrib-perf: update the config registration
Boris Feld <boris.feld@octobus.net>
parents: 34678
diff changeset
   288
        default=mercurial.configitems.dynamicdefault,
42776
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   289
        experimental=True,
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   290
    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   291
    configitem(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   292
        b'perf',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   293
        b'stub',
42776
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   294
        default=mercurial.configitems.dynamicdefault,
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   295
        experimental=True,
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   296
    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   297
    configitem(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   298
        b'perf',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   299
        b'parentscount',
42776
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   300
        default=mercurial.configitems.dynamicdefault,
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   301
        experimental=True,
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   302
    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   303
    configitem(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   304
        b'perf',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   305
        b'all-timing',
42776
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   306
        default=mercurial.configitems.dynamicdefault,
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   307
        experimental=True,
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   308
    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   309
    configitem(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   310
        b'perf',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   311
        b'pre-run',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   312
        default=mercurial.configitems.dynamicdefault,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   313
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   314
    configitem(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   315
        b'perf',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   316
        b'profile-benchmark',
42776
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   317
        default=mercurial.configitems.dynamicdefault,
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   318
    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   319
    configitem(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   320
        b'perf',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   321
        b'run-limits',
42776
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   322
        default=mercurial.configitems.dynamicdefault,
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   323
        experimental=True,
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   324
    )
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   325
except (ImportError, AttributeError):
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   326
    pass
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   327
except TypeError:
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   328
    # compatibility fix for a11fd395e83f
9f2189b6bf2a config: add experimental argument to the config registrar
Navaneeth Suresh <navaneeths1998@gmail.com>
parents: 42478
diff changeset
   329
    # hg version: 5.2
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   330
    configitem(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   331
        b'perf',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   332
        b'presleep',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   333
        default=mercurial.configitems.dynamicdefault,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   334
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   335
    configitem(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   336
        b'perf',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   337
        b'stub',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   338
        default=mercurial.configitems.dynamicdefault,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   339
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   340
    configitem(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   341
        b'perf',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   342
        b'parentscount',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   343
        default=mercurial.configitems.dynamicdefault,
34749
acdc574cb8d7 contrib-perf: update the config registration
Boris Feld <boris.feld@octobus.net>
parents: 34678
diff changeset
   344
    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   345
    configitem(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   346
        b'perf',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   347
        b'all-timing',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   348
        default=mercurial.configitems.dynamicdefault,
34494
bbb5687e5140 configitems: register the 'perf.stub' config
Boris Feld <boris.feld@octobus.net>
parents: 34350
diff changeset
   349
    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   350
    configitem(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   351
        b'perf',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   352
        b'pre-run',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   353
        default=mercurial.configitems.dynamicdefault,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   354
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   355
    configitem(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   356
        b'perf',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   357
        b'profile-benchmark',
34750
caf6c446cbe3 contrib-perf: register the 'parentscount' config item
Boris Feld <boris.feld@octobus.net>
parents: 34749
diff changeset
   358
        default=mercurial.configitems.dynamicdefault,
caf6c446cbe3 contrib-perf: register the 'parentscount' config item
Boris Feld <boris.feld@octobus.net>
parents: 34749
diff changeset
   359
    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   360
    configitem(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   361
        b'perf',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   362
        b'run-limits',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   363
        default=mercurial.configitems.dynamicdefault,
42381
563cd9a72682 perf: add a `pre-run` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   364
    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   365
34494
bbb5687e5140 configitems: register the 'perf.stub' config
Boris Feld <boris.feld@octobus.net>
parents: 34350
diff changeset
   366
27307
f36dc0062b1a perf: add getlen
timeless <timeless@mozdev.org>
parents: 27306
diff changeset
   367
def getlen(ui):
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   368
    if ui.configbool(b"perf", b"stub", False):
27307
f36dc0062b1a perf: add getlen
timeless <timeless@mozdev.org>
parents: 27306
diff changeset
   369
        return lambda x: 1
f36dc0062b1a perf: add getlen
timeless <timeless@mozdev.org>
parents: 27306
diff changeset
   370
    return len
f36dc0062b1a perf: add getlen
timeless <timeless@mozdev.org>
parents: 27306
diff changeset
   371
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   372
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
   373
class noop:
42382
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
   374
    """dummy context manager"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   375
42382
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
   376
    def __enter__(self):
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
   377
        pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   378
42382
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
   379
    def __exit__(self, *args):
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
   380
        pass
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
   381
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   382
42386
a09829e14fc0 perf: make sure to explicitly disable any profiler after the first iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42382
diff changeset
   383
NOOPCTX = noop()
a09829e14fc0 perf: make sure to explicitly disable any profiler after the first iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42382
diff changeset
   384
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   385
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
   386
def gettimer(ui, opts=None):
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
   387
    """return a timer function and formatter: (timer, formatter)
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
   388
27303
57bd9c5431a5 perf: improve grammar of gettimer comment
timeless <timeless@mozdev.org>
parents: 27286
diff changeset
   389
    This function exists to gather the creation of formatter in a single
57bd9c5431a5 perf: improve grammar of gettimer comment
timeless <timeless@mozdev.org>
parents: 27286
diff changeset
   390
    place instead of duplicating it in all performance commands."""
23788
316ad725a1dd perf: add a configurable sleep on startup
Matt Mackall <mpm@selenic.com>
parents: 23537
diff changeset
   391
316ad725a1dd perf: add a configurable sleep on startup
Matt Mackall <mpm@selenic.com>
parents: 23537
diff changeset
   392
    # enforce an idle period before execution to counteract power management
25850
b130764e3eb5 perf: mark experimental option presleep
Matt Mackall <mpm@selenic.com>
parents: 25494
diff changeset
   393
    # experimental config: perf.presleep
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   394
    time.sleep(getint(ui, b"perf", b"presleep", 1))
23788
316ad725a1dd perf: add a configurable sleep on startup
Matt Mackall <mpm@selenic.com>
parents: 23537
diff changeset
   395
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
   396
    if opts is None:
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
   397
        opts = {}
30415
e77e8876886f perf: omit copying ui and redirect to ferr if buffer API is in use
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 30380
diff changeset
   398
    # redirect all to stderr unless buffer api is in use
e77e8876886f perf: omit copying ui and redirect to ferr if buffer API is in use
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 30380
diff changeset
   399
    if not ui._buffers:
e77e8876886f perf: omit copying ui and redirect to ferr if buffer API is in use
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 30380
diff changeset
   400
        ui = ui.copy()
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   401
        uifout = safeattrsetter(ui, b'fout', ignoremissing=True)
30415
e77e8876886f perf: omit copying ui and redirect to ferr if buffer API is in use
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 30380
diff changeset
   402
        if uifout:
e77e8876886f perf: omit copying ui and redirect to ferr if buffer API is in use
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 30380
diff changeset
   403
            # for "historical portability":
e77e8876886f perf: omit copying ui and redirect to ferr if buffer API is in use
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 30380
diff changeset
   404
            # ui.fout/ferr have been available since 1.9 (or 4e1ccd4c2b6d)
e77e8876886f perf: omit copying ui and redirect to ferr if buffer API is in use
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 30380
diff changeset
   405
            uifout.set(ui.ferr)
30147
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   406
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
   407
    # get a formatter
30147
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   408
    uiformatter = getattr(ui, 'formatter', None)
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   409
    if uiformatter:
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   410
        fm = uiformatter(b'perf', opts)
30147
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   411
    else:
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   412
        # for "historical portability":
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   413
        # define formatter locally, because ui.formatter has been
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   414
        # available since 2.2 (or ae5f92e154d3)
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   415
        from mercurial import node
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   416
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
   417
        class defaultformatter:
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   418
            """Minimized composition of baseformatter and plainformatter"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   419
30147
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   420
            def __init__(self, ui, topic, opts):
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   421
                self._ui = ui
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   422
                if ui.debugflag:
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   423
                    self.hexfunc = node.hex
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   424
                else:
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   425
                    self.hexfunc = node.short
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   426
30147
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   427
            def __nonzero__(self):
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   428
                return False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   429
31483
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31406
diff changeset
   430
            __bool__ = __nonzero__
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   431
30147
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   432
            def startitem(self):
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   433
                pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   434
30147
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   435
            def data(self, **data):
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   436
                pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   437
30147
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   438
            def write(self, fields, deftext, *fielddata, **opts):
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   439
                self._ui.write(deftext % fielddata, **opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   440
30147
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   441
            def condwrite(self, cond, fields, deftext, *fielddata, **opts):
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   442
                if cond:
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   443
                    self._ui.write(deftext % fielddata, **opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   444
30147
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   445
            def plain(self, text, **opts):
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   446
                self._ui.write(text, **opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   447
30147
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   448
            def end(self):
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   449
                pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   450
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   451
        fm = defaultformatter(ui, b'perf', opts)
30147
423bf74d2e5b perf: define formatter locally for Mercurial earlier than 2.2
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30146
diff changeset
   452
27304
a6fd79495770 perf: offer perf.stub to only run one loop
timeless <timeless@mozdev.org>
parents: 27303
diff changeset
   453
    # stub function, runs code only once instead of in a loop
a6fd79495770 perf: offer perf.stub to only run one loop
timeless <timeless@mozdev.org>
parents: 27303
diff changeset
   454
    # experimental config: perf.stub
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   455
    if ui.configbool(b"perf", b"stub", False):
27304
a6fd79495770 perf: offer perf.stub to only run one loop
timeless <timeless@mozdev.org>
parents: 27303
diff changeset
   456
        return functools.partial(stub_timer, fm), fm
38694
55101513ed94 perf: add a 'perf.all-timing' option to display more than best time
Boris Feld <boris.feld@octobus.net>
parents: 38693
diff changeset
   457
55101513ed94 perf: add a 'perf.all-timing' option to display more than best time
Boris Feld <boris.feld@octobus.net>
parents: 38693
diff changeset
   458
    # experimental config: perf.all-timing
50839
cf0502231d56 perf: display all timing by default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50832
diff changeset
   459
    displayall = ui.configbool(b"perf", b"all-timing", True)
42019
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
   460
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
   461
    # experimental config: perf.run-limits
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
   462
    limitspec = ui.configlist(b"perf", b"run-limits", [])
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
   463
    limits = []
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
   464
    for item in limitspec:
42063
912d82daeda3 perf: make perf.run-limits code work with Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42021
diff changeset
   465
        parts = item.split(b'-', 1)
42019
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
   466
        if len(parts) < 2:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   467
            ui.warn((b'malformatted run limit entry, missing "-": %s\n' % item))
42019
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
   468
            continue
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
   469
        try:
42801
c00005975c91 perf: don't depend on pycompat for older Mercurial versions
Martin von Zweigbergk <martinvonz@google.com>
parents: 42800
diff changeset
   470
            time_limit = float(_sysstr(parts[0]))
42019
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
   471
        except ValueError as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   472
            ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   473
                (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   474
                    b'malformatted run limit entry, %s: %s\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   475
                    % (_bytestr(e), item)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   476
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   477
            )
42019
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
   478
            continue
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
   479
        try:
42801
c00005975c91 perf: don't depend on pycompat for older Mercurial versions
Martin von Zweigbergk <martinvonz@google.com>
parents: 42800
diff changeset
   480
            run_limit = int(_sysstr(parts[1]))
42019
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
   481
        except ValueError as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   482
            ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   483
                (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   484
                    b'malformatted run limit entry, %s: %s\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   485
                    % (_bytestr(e), item)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   486
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   487
            )
42019
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
   488
            continue
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
   489
        limits.append((time_limit, run_limit))
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
   490
    if not limits:
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
   491
        limits = DEFAULTLIMITS
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
   492
42382
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
   493
    profiler = None
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
   494
    if profiling is not None:
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
   495
        if ui.configbool(b"perf", b"profile-benchmark", False):
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
   496
            profiler = profiling.profile(ui)
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
   497
42381
563cd9a72682 perf: add a `pre-run` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   498
    prerun = getint(ui, b"perf", b"pre-run", 0)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   499
    t = functools.partial(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   500
        _timer,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   501
        fm,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   502
        displayall=displayall,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   503
        limits=limits,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   504
        prerun=prerun,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   505
        profiler=profiler,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   506
    )
42019
5a1e621b8186 perf: introduce a `perf.run-limits` options
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42018
diff changeset
   507
    return t, fm
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
   508
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   509
40719
9d88ae5c635b perf: add a `setup` argument to run code outside of the timed section
Boris Feld <boris.feld@octobus.net>
parents: 40718
diff changeset
   510
def stub_timer(fm, func, setup=None, title=None):
40760
0adc2c0a0792 perf: run 'setup' function during stub run
Boris Feld <boris.feld@octobus.net>
parents: 40759
diff changeset
   511
    if setup is not None:
0adc2c0a0792 perf: run 'setup' function during stub run
Boris Feld <boris.feld@octobus.net>
parents: 40759
diff changeset
   512
        setup()
27304
a6fd79495770 perf: offer perf.stub to only run one loop
timeless <timeless@mozdev.org>
parents: 27303
diff changeset
   513
    func()
a6fd79495770 perf: offer perf.stub to only run one loop
timeless <timeless@mozdev.org>
parents: 27303
diff changeset
   514
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   515
40144
acf560bc9b56 perf: extract the timing of a section in a context manager
Boris Feld <boris.feld@octobus.net>
parents: 40143
diff changeset
   516
@contextlib.contextmanager
acf560bc9b56 perf: extract the timing of a section in a context manager
Boris Feld <boris.feld@octobus.net>
parents: 40143
diff changeset
   517
def timeone():
acf560bc9b56 perf: extract the timing of a section in a context manager
Boris Feld <boris.feld@octobus.net>
parents: 40143
diff changeset
   518
    r = []
acf560bc9b56 perf: extract the timing of a section in a context manager
Boris Feld <boris.feld@octobus.net>
parents: 40143
diff changeset
   519
    ostart = os.times()
acf560bc9b56 perf: extract the timing of a section in a context manager
Boris Feld <boris.feld@octobus.net>
parents: 40143
diff changeset
   520
    cstart = util.timer()
acf560bc9b56 perf: extract the timing of a section in a context manager
Boris Feld <boris.feld@octobus.net>
parents: 40143
diff changeset
   521
    yield r
acf560bc9b56 perf: extract the timing of a section in a context manager
Boris Feld <boris.feld@octobus.net>
parents: 40143
diff changeset
   522
    cstop = util.timer()
acf560bc9b56 perf: extract the timing of a section in a context manager
Boris Feld <boris.feld@octobus.net>
parents: 40143
diff changeset
   523
    ostop = os.times()
acf560bc9b56 perf: extract the timing of a section in a context manager
Boris Feld <boris.feld@octobus.net>
parents: 40143
diff changeset
   524
    a, b = ostart, ostop
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   525
    r.append((cstop - cstart, b[0] - a[0], b[1] - a[1]))
40144
acf560bc9b56 perf: extract the timing of a section in a context manager
Boris Feld <boris.feld@octobus.net>
parents: 40143
diff changeset
   526
42017
87066cf5ec0f perf: more flexible implementation for checking stop conditions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42016
diff changeset
   527
87066cf5ec0f perf: more flexible implementation for checking stop conditions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42016
diff changeset
   528
# list of stop condition (elapsed time, minimal run count)
87066cf5ec0f perf: more flexible implementation for checking stop conditions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42016
diff changeset
   529
DEFAULTLIMITS = (
87066cf5ec0f perf: more flexible implementation for checking stop conditions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42016
diff changeset
   530
    (3.0, 100),
87066cf5ec0f perf: more flexible implementation for checking stop conditions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42016
diff changeset
   531
    (10.0, 3),
87066cf5ec0f perf: more flexible implementation for checking stop conditions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42016
diff changeset
   532
)
87066cf5ec0f perf: more flexible implementation for checking stop conditions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42016
diff changeset
   533
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   534
50684
28620be88da9 perf: add a new "context" argument to timer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50683
diff changeset
   535
@contextlib.contextmanager
28620be88da9 perf: add a new "context" argument to timer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50683
diff changeset
   536
def noop_context():
28620be88da9 perf: add a new "context" argument to timer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50683
diff changeset
   537
    yield
28620be88da9 perf: add a new "context" argument to timer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50683
diff changeset
   538
28620be88da9 perf: add a new "context" argument to timer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50683
diff changeset
   539
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   540
def _timer(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   541
    fm,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   542
    func,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   543
    setup=None,
50684
28620be88da9 perf: add a new "context" argument to timer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50683
diff changeset
   544
    context=noop_context,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   545
    title=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   546
    displayall=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   547
    limits=DEFAULTLIMITS,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   548
    prerun=0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   549
    profiler=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   550
):
31406
8f5ed8fa39f8 perf: perform a garbage collection before each iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30997
diff changeset
   551
    gc.collect()
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   552
    results = []
30995
22fbca1d11ed mercurial: switch to util.timer for all interval timings
Simon Farnsworth <simonfar@fb.com>
parents: 30914
diff changeset
   553
    begin = util.timer()
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   554
    count = 0
42382
3293086ff663 perf: add an option to profile the benchmark section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42381
diff changeset
   555
    if profiler is None:
42386
a09829e14fc0 perf: make sure to explicitly disable any profiler after the first iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42382
diff changeset
   556
        profiler = NOOPCTX
42392
c2d10506725c py3: use range() instead of xrange()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 42386
diff changeset
   557
    for i in range(prerun):
42381
563cd9a72682 perf: add a `pre-run` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   558
        if setup is not None:
563cd9a72682 perf: add a `pre-run` option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   559
            setup()
50684
28620be88da9 perf: add a new "context" argument to timer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50683
diff changeset
   560
        with context():
28620be88da9 perf: add a new "context" argument to timer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50683
diff changeset
   561
            func()
42017
87066cf5ec0f perf: more flexible implementation for checking stop conditions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42016
diff changeset
   562
    keepgoing = True
87066cf5ec0f perf: more flexible implementation for checking stop conditions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42016
diff changeset
   563
    while keepgoing:
40719
9d88ae5c635b perf: add a `setup` argument to run code outside of the timed section
Boris Feld <boris.feld@octobus.net>
parents: 40718
diff changeset
   564
        if setup is not None:
9d88ae5c635b perf: add a `setup` argument to run code outside of the timed section
Boris Feld <boris.feld@octobus.net>
parents: 40718
diff changeset
   565
            setup()
50684
28620be88da9 perf: add a new "context" argument to timer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50683
diff changeset
   566
        with context():
28620be88da9 perf: add a new "context" argument to timer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50683
diff changeset
   567
            with profiler:
28620be88da9 perf: add a new "context" argument to timer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50683
diff changeset
   568
                with timeone() as item:
28620be88da9 perf: add a new "context" argument to timer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50683
diff changeset
   569
                    r = func()
42386
a09829e14fc0 perf: make sure to explicitly disable any profiler after the first iteration
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42382
diff changeset
   570
        profiler = NOOPCTX
40144
acf560bc9b56 perf: extract the timing of a section in a context manager
Boris Feld <boris.feld@octobus.net>
parents: 40143
diff changeset
   571
        count += 1
acf560bc9b56 perf: extract the timing of a section in a context manager
Boris Feld <boris.feld@octobus.net>
parents: 40143
diff changeset
   572
        results.append(item[0])
30995
22fbca1d11ed mercurial: switch to util.timer for all interval timings
Simon Farnsworth <simonfar@fb.com>
parents: 30914
diff changeset
   573
        cstop = util.timer()
42017
87066cf5ec0f perf: more flexible implementation for checking stop conditions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42016
diff changeset
   574
        # Look for a stop condition.
87066cf5ec0f perf: more flexible implementation for checking stop conditions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42016
diff changeset
   575
        elapsed = cstop - begin
42018
0e6422942c84 perf: pass limits as a function argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42017
diff changeset
   576
        for t, mincount in limits:
42017
87066cf5ec0f perf: more flexible implementation for checking stop conditions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42016
diff changeset
   577
            if elapsed >= t and count >= mincount:
87066cf5ec0f perf: more flexible implementation for checking stop conditions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42016
diff changeset
   578
                keepgoing = False
87066cf5ec0f perf: more flexible implementation for checking stop conditions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42016
diff changeset
   579
                break
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
   580
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   581
    formatone(fm, results, title=title, result=r, displayall=displayall)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   582
40145
21261fc0fb2b perf: extract result formatting in its own function
Boris Feld <boris.feld@octobus.net>
parents: 40144
diff changeset
   583
21261fc0fb2b perf: extract result formatting in its own function
Boris Feld <boris.feld@octobus.net>
parents: 40144
diff changeset
   584
def formatone(fm, timings, title=None, result=None, displayall=False):
21261fc0fb2b perf: extract result formatting in its own function
Boris Feld <boris.feld@octobus.net>
parents: 40144
diff changeset
   585
    count = len(timings)
21261fc0fb2b perf: extract result formatting in its own function
Boris Feld <boris.feld@octobus.net>
parents: 40144
diff changeset
   586
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
   587
    fm.startitem()
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
   588
9826
d768614578dd contrib/perf: profile diff of working directory changes
Patrick Mezard <pmezard@gmail.com>
parents: 9146
diff changeset
   589
    if title:
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   590
        fm.write(b'title', b'! %s\n', title)
40145
21261fc0fb2b perf: extract result formatting in its own function
Boris Feld <boris.feld@octobus.net>
parents: 40144
diff changeset
   591
    if result:
21261fc0fb2b perf: extract result formatting in its own function
Boris Feld <boris.feld@octobus.net>
parents: 40144
diff changeset
   592
        fm.write(b'result', b'! result: %s\n', result)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   593
38694
55101513ed94 perf: add a 'perf.all-timing' option to display more than best time
Boris Feld <boris.feld@octobus.net>
parents: 38693
diff changeset
   594
    def display(role, entry):
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   595
        prefix = b''
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   596
        if role != b'best':
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   597
            prefix = b'%s.' % role
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   598
        fm.plain(b'!')
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   599
        fm.write(prefix + b'wall', b' wall %f', entry[0])
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   600
        fm.write(prefix + b'comb', b' comb %f', entry[1] + entry[2])
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   601
        fm.write(prefix + b'user', b' user %f', entry[1])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   602
        fm.write(prefix + b'sys', b' sys %f', entry[2])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   603
        fm.write(prefix + b'count', b' (%s of %%d)' % role, count)
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   604
        fm.plain(b'\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   605
40145
21261fc0fb2b perf: extract result formatting in its own function
Boris Feld <boris.feld@octobus.net>
parents: 40144
diff changeset
   606
    timings.sort()
21261fc0fb2b perf: extract result formatting in its own function
Boris Feld <boris.feld@octobus.net>
parents: 40144
diff changeset
   607
    min_val = timings[0]
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   608
    display(b'best', min_val)
38694
55101513ed94 perf: add a 'perf.all-timing' option to display more than best time
Boris Feld <boris.feld@octobus.net>
parents: 38693
diff changeset
   609
    if displayall:
40145
21261fc0fb2b perf: extract result formatting in its own function
Boris Feld <boris.feld@octobus.net>
parents: 40144
diff changeset
   610
        max_val = timings[-1]
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   611
        display(b'max', max_val)
40145
21261fc0fb2b perf: extract result formatting in its own function
Boris Feld <boris.feld@octobus.net>
parents: 40144
diff changeset
   612
        avg = tuple([sum(x) / count for x in zip(*timings)])
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   613
        display(b'avg', avg)
40145
21261fc0fb2b perf: extract result formatting in its own function
Boris Feld <boris.feld@octobus.net>
parents: 40144
diff changeset
   614
        median = timings[len(timings) // 2]
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   615
        display(b'median', median)
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   616
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   617
30143
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   618
# utilities for historical portability
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   619
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   620
30149
d8a2c536dd96 perf: replace ui.configint() by getint() for Mercurial earlier than 1.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30148
diff changeset
   621
def getint(ui, section, name, default):
d8a2c536dd96 perf: replace ui.configint() by getint() for Mercurial earlier than 1.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30148
diff changeset
   622
    # for "historical portability":
d8a2c536dd96 perf: replace ui.configint() by getint() for Mercurial earlier than 1.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30148
diff changeset
   623
    # ui.configint has been available since 1.9 (or fa2b596db182)
d8a2c536dd96 perf: replace ui.configint() by getint() for Mercurial earlier than 1.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30148
diff changeset
   624
    v = ui.config(section, name, None)
d8a2c536dd96 perf: replace ui.configint() by getint() for Mercurial earlier than 1.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30148
diff changeset
   625
    if v is None:
d8a2c536dd96 perf: replace ui.configint() by getint() for Mercurial earlier than 1.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30148
diff changeset
   626
        return default
d8a2c536dd96 perf: replace ui.configint() by getint() for Mercurial earlier than 1.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30148
diff changeset
   627
    try:
d8a2c536dd96 perf: replace ui.configint() by getint() for Mercurial earlier than 1.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30148
diff changeset
   628
        return int(v)
d8a2c536dd96 perf: replace ui.configint() by getint() for Mercurial earlier than 1.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30148
diff changeset
   629
    except ValueError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   630
        raise error.ConfigError(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   631
            b"%s.%s is not an integer ('%s')" % (section, name, v)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   632
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   633
30149
d8a2c536dd96 perf: replace ui.configint() by getint() for Mercurial earlier than 1.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30148
diff changeset
   634
30143
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   635
def safeattrsetter(obj, name, ignoremissing=False):
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   636
    """Ensure that 'obj' has 'name' attribute before subsequent setattr
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   637
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   638
    This function is aborted, if 'obj' doesn't have 'name' attribute
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   639
    at runtime. This avoids overlooking removal of an attribute, which
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   640
    breaks assumption of performance measurement, in the future.
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   641
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   642
    This function returns the object to (1) assign a new value, and
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   643
    (2) restore an original value to the attribute.
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   644
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   645
    If 'ignoremissing' is true, missing 'name' attribute doesn't cause
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   646
    abortion, and this function returns None. This is useful to
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   647
    examine an attribute, which isn't ensured in all Mercurial
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   648
    versions.
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   649
    """
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   650
    if not util.safehasattr(obj, name):
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   651
        if ignoremissing:
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   652
            return None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   653
        raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   654
            (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   655
                b"missing attribute %s of %s might break assumption"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   656
                b" of performance measurement"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   657
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   658
            % (name, obj)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   659
        )
30143
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   660
39826
6787dc1b93a9 py3: handle sysstr conversion around get/set attr in contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39779
diff changeset
   661
    origvalue = getattr(obj, _sysstr(name))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   662
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
   663
    class attrutil:
30143
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   664
        def set(self, newvalue):
39826
6787dc1b93a9 py3: handle sysstr conversion around get/set attr in contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39779
diff changeset
   665
            setattr(obj, _sysstr(name), newvalue)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   666
30143
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   667
        def restore(self):
39826
6787dc1b93a9 py3: handle sysstr conversion around get/set attr in contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39779
diff changeset
   668
            setattr(obj, _sysstr(name), origvalue)
30143
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   669
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   670
    return attrutil()
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   671
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   672
30144
14031d183048 perf: get subsettable from appropriate module for Mercurial earlier than 2.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30143
diff changeset
   673
# utilities to examine each internal API changes
14031d183048 perf: get subsettable from appropriate module for Mercurial earlier than 2.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30143
diff changeset
   674
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   675
30144
14031d183048 perf: get subsettable from appropriate module for Mercurial earlier than 2.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30143
diff changeset
   676
def getbranchmapsubsettable():
14031d183048 perf: get subsettable from appropriate module for Mercurial earlier than 2.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30143
diff changeset
   677
    # for "historical portability":
14031d183048 perf: get subsettable from appropriate module for Mercurial earlier than 2.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30143
diff changeset
   678
    # subsettable is defined in:
14031d183048 perf: get subsettable from appropriate module for Mercurial earlier than 2.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30143
diff changeset
   679
    # - branchmap since 2.9 (or 175c6fd8cacc)
14031d183048 perf: get subsettable from appropriate module for Mercurial earlier than 2.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30143
diff changeset
   680
    # - repoview since 2.5 (or 59a9f18d4587)
42138
caebe5e7f4bd repoview: move subsettable in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42063
diff changeset
   681
    # - repoviewutil since 5.0
caebe5e7f4bd repoview: move subsettable in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42063
diff changeset
   682
    for mod in (branchmap, repoview, repoviewutil):
30144
14031d183048 perf: get subsettable from appropriate module for Mercurial earlier than 2.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30143
diff changeset
   683
        subsettable = getattr(mod, 'subsettable', None)
14031d183048 perf: get subsettable from appropriate module for Mercurial earlier than 2.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30143
diff changeset
   684
        if subsettable:
14031d183048 perf: get subsettable from appropriate module for Mercurial earlier than 2.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30143
diff changeset
   685
            return subsettable
14031d183048 perf: get subsettable from appropriate module for Mercurial earlier than 2.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30143
diff changeset
   686
14031d183048 perf: get subsettable from appropriate module for Mercurial earlier than 2.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30143
diff changeset
   687
    # bisecting in bcee63733aad::59a9f18d4587 can reach here (both
14031d183048 perf: get subsettable from appropriate module for Mercurial earlier than 2.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30143
diff changeset
   688
    # branchmap and repoview modules exist, but subsettable attribute
14031d183048 perf: get subsettable from appropriate module for Mercurial earlier than 2.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30143
diff changeset
   689
    # doesn't)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   690
    raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   691
        b"perfbranchmap not available with this Mercurial",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   692
        hint=b"use 2.5 or later",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   693
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   694
30144
14031d183048 perf: get subsettable from appropriate module for Mercurial earlier than 2.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30143
diff changeset
   695
30146
148ccd1d9f2f perf: add functions to get vfs-like object for Mercurial earlier than 2.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30145
diff changeset
   696
def getsvfs(repo):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   697
    """Return appropriate object to access files under .hg/store"""
30146
148ccd1d9f2f perf: add functions to get vfs-like object for Mercurial earlier than 2.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30145
diff changeset
   698
    # for "historical portability":
148ccd1d9f2f perf: add functions to get vfs-like object for Mercurial earlier than 2.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30145
diff changeset
   699
    # repo.svfs has been available since 2.3 (or 7034365089bf)
148ccd1d9f2f perf: add functions to get vfs-like object for Mercurial earlier than 2.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30145
diff changeset
   700
    svfs = getattr(repo, 'svfs', None)
148ccd1d9f2f perf: add functions to get vfs-like object for Mercurial earlier than 2.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30145
diff changeset
   701
    if svfs:
148ccd1d9f2f perf: add functions to get vfs-like object for Mercurial earlier than 2.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30145
diff changeset
   702
        return svfs
148ccd1d9f2f perf: add functions to get vfs-like object for Mercurial earlier than 2.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30145
diff changeset
   703
    else:
148ccd1d9f2f perf: add functions to get vfs-like object for Mercurial earlier than 2.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30145
diff changeset
   704
        return getattr(repo, 'sopener')
148ccd1d9f2f perf: add functions to get vfs-like object for Mercurial earlier than 2.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30145
diff changeset
   705
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   706
30146
148ccd1d9f2f perf: add functions to get vfs-like object for Mercurial earlier than 2.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30145
diff changeset
   707
def getvfs(repo):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   708
    """Return appropriate object to access files under .hg"""
30146
148ccd1d9f2f perf: add functions to get vfs-like object for Mercurial earlier than 2.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30145
diff changeset
   709
    # for "historical portability":
148ccd1d9f2f perf: add functions to get vfs-like object for Mercurial earlier than 2.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30145
diff changeset
   710
    # repo.vfs has been available since 2.3 (or 7034365089bf)
148ccd1d9f2f perf: add functions to get vfs-like object for Mercurial earlier than 2.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30145
diff changeset
   711
    vfs = getattr(repo, 'vfs', None)
148ccd1d9f2f perf: add functions to get vfs-like object for Mercurial earlier than 2.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30145
diff changeset
   712
    if vfs:
148ccd1d9f2f perf: add functions to get vfs-like object for Mercurial earlier than 2.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30145
diff changeset
   713
        return vfs
148ccd1d9f2f perf: add functions to get vfs-like object for Mercurial earlier than 2.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30145
diff changeset
   714
    else:
148ccd1d9f2f perf: add functions to get vfs-like object for Mercurial earlier than 2.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30145
diff changeset
   715
        return getattr(repo, 'opener')
148ccd1d9f2f perf: add functions to get vfs-like object for Mercurial earlier than 2.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30145
diff changeset
   716
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   717
30150
c0410814002f perf: make perftags clear tags cache correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30149
diff changeset
   718
def repocleartagscachefunc(repo):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   719
    """Return the function to clear tags cache according to repo internal API"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   720
    if util.safehasattr(repo, b'_tagscache'):  # since 2.0 (or 9dca7653b525)
30150
c0410814002f perf: make perftags clear tags cache correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30149
diff changeset
   721
        # in this case, setattr(repo, '_tagscache', None) or so isn't
c0410814002f perf: make perftags clear tags cache correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30149
diff changeset
   722
        # correct way to clear tags cache, because existing code paths
c0410814002f perf: make perftags clear tags cache correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30149
diff changeset
   723
        # expect _tagscache to be a structured object.
c0410814002f perf: make perftags clear tags cache correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30149
diff changeset
   724
        def clearcache():
c0410814002f perf: make perftags clear tags cache correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30149
diff changeset
   725
            # _tagscache has been filteredpropertycache since 2.5 (or
c0410814002f perf: make perftags clear tags cache correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30149
diff changeset
   726
            # 98c867ac1330), and delattr() can't work in such case
43421
be384a2052aa py3: don't use bytes with vars() or __dict__
Martin von Zweigbergk <martinvonz@google.com>
parents: 43197
diff changeset
   727
            if '_tagscache' in vars(repo):
be384a2052aa py3: don't use bytes with vars() or __dict__
Martin von Zweigbergk <martinvonz@google.com>
parents: 43197
diff changeset
   728
                del repo.__dict__['_tagscache']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   729
30150
c0410814002f perf: make perftags clear tags cache correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30149
diff changeset
   730
        return clearcache
c0410814002f perf: make perftags clear tags cache correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30149
diff changeset
   731
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   732
    repotags = safeattrsetter(repo, b'_tags', ignoremissing=True)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   733
    if repotags:  # since 1.4 (or 5614a628d173)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   734
        return lambda: repotags.set(None)
30150
c0410814002f perf: make perftags clear tags cache correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30149
diff changeset
   735
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   736
    repotagscache = safeattrsetter(repo, b'tagscache', ignoremissing=True)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   737
    if repotagscache:  # since 0.6 (or d7df759d0e97)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   738
        return lambda: repotagscache.set(None)
30150
c0410814002f perf: make perftags clear tags cache correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30149
diff changeset
   739
c0410814002f perf: make perftags clear tags cache correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30149
diff changeset
   740
    # Mercurial earlier than 0.6 (or d7df759d0e97) logically reaches
c0410814002f perf: make perftags clear tags cache correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30149
diff changeset
   741
    # this point, but it isn't so problematic, because:
c0410814002f perf: make perftags clear tags cache correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30149
diff changeset
   742
    # - repo.tags of such Mercurial isn't "callable", and repo.tags()
c0410814002f perf: make perftags clear tags cache correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30149
diff changeset
   743
    #   in perftags() causes failure soon
c0410814002f perf: make perftags clear tags cache correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30149
diff changeset
   744
    # - perf.py itself has been available since 1.1 (or eb240755386d)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   745
    raise error.Abort(b"tags API of this hg command is unknown")
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   746
30150
c0410814002f perf: make perftags clear tags cache correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30149
diff changeset
   747
32751
6f791ca70640 perf: have a generic "clearstorecache" function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32730
diff changeset
   748
# utilities to clear cache
6f791ca70640 perf: have a generic "clearstorecache" function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32730
diff changeset
   749
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   750
40722
d7936a9dad47 perf: make `clearfilecache` helper work with any object
Boris Feld <boris.feld@octobus.net>
parents: 40721
diff changeset
   751
def clearfilecache(obj, attrname):
d7936a9dad47 perf: make `clearfilecache` helper work with any object
Boris Feld <boris.feld@octobus.net>
parents: 40721
diff changeset
   752
    unfiltered = getattr(obj, 'unfiltered', None)
d7936a9dad47 perf: make `clearfilecache` helper work with any object
Boris Feld <boris.feld@octobus.net>
parents: 40721
diff changeset
   753
    if unfiltered is not None:
d7936a9dad47 perf: make `clearfilecache` helper work with any object
Boris Feld <boris.feld@octobus.net>
parents: 40721
diff changeset
   754
        obj = obj.unfiltered()
d7936a9dad47 perf: make `clearfilecache` helper work with any object
Boris Feld <boris.feld@octobus.net>
parents: 40721
diff changeset
   755
    if attrname in vars(obj):
d7936a9dad47 perf: make `clearfilecache` helper work with any object
Boris Feld <boris.feld@octobus.net>
parents: 40721
diff changeset
   756
        delattr(obj, attrname)
d7936a9dad47 perf: make `clearfilecache` helper work with any object
Boris Feld <boris.feld@octobus.net>
parents: 40721
diff changeset
   757
    obj._filecache.pop(attrname, None)
32751
6f791ca70640 perf: have a generic "clearstorecache" function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32730
diff changeset
   758
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   759
40740
e4ea63855d5a perf: introduce a function to fully "unload" a changelog
Boris Feld <boris.feld@octobus.net>
parents: 40739
diff changeset
   760
def clearchangelog(repo):
e4ea63855d5a perf: introduce a function to fully "unload" a changelog
Boris Feld <boris.feld@octobus.net>
parents: 40739
diff changeset
   761
    if repo is not repo.unfiltered():
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43551
diff changeset
   762
        object.__setattr__(repo, '_clcachekey', None)
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43551
diff changeset
   763
        object.__setattr__(repo, '_clcache', None)
40740
e4ea63855d5a perf: introduce a function to fully "unload" a changelog
Boris Feld <boris.feld@octobus.net>
parents: 40739
diff changeset
   764
    clearfilecache(repo.unfiltered(), 'changelog')
e4ea63855d5a perf: introduce a function to fully "unload" a changelog
Boris Feld <boris.feld@octobus.net>
parents: 40739
diff changeset
   765
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   766
30143
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   767
# perf commands
2d858c771760 perf: introduce safeattrsetter to replace direct attribute assignment
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30069
diff changeset
   768
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   769
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
   770
@command(b'perf::walk|perfwalk', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
   771
def perfwalk(ui, repo, *pats, **opts):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
   772
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
   773
    timer, fm = gettimer(ui, opts)
34349
b3538c03a804 perf: remove fallbacks to ancient versions of dirstate.walk()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32906
diff changeset
   774
    m = scmutil.match(repo[None], pats, {})
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   775
    timer(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   776
        lambda: len(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   777
            list(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   778
                repo.dirstate.walk(m, subrepos=[], unknown=True, ignored=False)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   779
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   780
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   781
    )
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
   782
    fm.end()
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   783
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   784
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
   785
@command(b'perf::annotate|perfannotate', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
   786
def perfannotate(ui, repo, f, **opts):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
   787
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
   788
    timer, fm = gettimer(ui, opts)
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   789
    fc = repo[b'.'][f]
19292
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 18877
diff changeset
   790
    timer(lambda: len(fc.annotate(True)))
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
   791
    fm.end()
19292
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 18877
diff changeset
   792
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   793
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   794
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
   795
    b'perf::status|perfstatus',
43488
bfc68404cccd perf: add a way to benchmark `dirstate.status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43197
diff changeset
   796
    [
bfc68404cccd perf: add a way to benchmark `dirstate.status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43197
diff changeset
   797
        (b'u', b'unknown', False, b'ask status to look for unknown files'),
bfc68404cccd perf: add a way to benchmark `dirstate.status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43197
diff changeset
   798
        (b'', b'dirstate', False, b'benchmark the internal dirstate call'),
bfc68404cccd perf: add a way to benchmark `dirstate.status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43197
diff changeset
   799
    ]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   800
    + formatteropts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   801
)
18033
00ac420f24ee perf: add option to perfstatus to get the status of unknown files
Siddharth Agarwal <sid0@fb.com>
parents: 17780
diff changeset
   802
def perfstatus(ui, repo, **opts):
43120
97f80dd21312 perf: document `perfstatus`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   803
    """benchmark the performance of a single status call
97f80dd21312 perf: document `perfstatus`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   804
97f80dd21312 perf: document `perfstatus`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   805
    The repository data are preserved between each call.
97f80dd21312 perf: document `perfstatus`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   806
97f80dd21312 perf: document `perfstatus`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   807
    By default, only the status of the tracked file are requested. If
97f80dd21312 perf: document `perfstatus`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   808
    `--unknown` is passed, the "unknown" files are also tracked.
97f80dd21312 perf: document `perfstatus`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   809
    """
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
   810
    opts = _byteskwargs(opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   811
    # m = match.always(repo.root, repo.getcwd())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   812
    # timer(lambda: sum(map(len, repo.dirstate.status(m, [], False, False,
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16414
diff changeset
   813
    #                                                False))))
27017
cdc3e437b481 perf: un-bitrot perfstatus
Matt Mackall <mpm@selenic.com>
parents: 26748
diff changeset
   814
    timer, fm = gettimer(ui, opts)
43488
bfc68404cccd perf: add a way to benchmark `dirstate.status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43197
diff changeset
   815
    if opts[b'dirstate']:
bfc68404cccd perf: add a way to benchmark `dirstate.status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43197
diff changeset
   816
        dirstate = repo.dirstate
bfc68404cccd perf: add a way to benchmark `dirstate.status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43197
diff changeset
   817
        m = scmutil.matchall(repo)
bfc68404cccd perf: add a way to benchmark `dirstate.status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43197
diff changeset
   818
        unknown = opts[b'unknown']
bfc68404cccd perf: add a way to benchmark `dirstate.status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43197
diff changeset
   819
bfc68404cccd perf: add a way to benchmark `dirstate.status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43197
diff changeset
   820
        def status_dirstate():
bfc68404cccd perf: add a way to benchmark `dirstate.status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43197
diff changeset
   821
            s = dirstate.status(
bfc68404cccd perf: add a way to benchmark `dirstate.status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43197
diff changeset
   822
                m, subrepos=[], ignored=False, clean=False, unknown=unknown
bfc68404cccd perf: add a way to benchmark `dirstate.status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43197
diff changeset
   823
            )
43697
6186c2a53ea5 perf: bool() elements of dirstate.status return instead of len()
Augie Fackler <augie@google.com>
parents: 43620
diff changeset
   824
            sum(map(bool, s))
43488
bfc68404cccd perf: add a way to benchmark `dirstate.status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43197
diff changeset
   825
50192
ec3631290eb7 contrib-perf: use `running_status` in `perf::status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50064
diff changeset
   826
        if util.safehasattr(dirstate, 'running_status'):
ec3631290eb7 contrib-perf: use `running_status` in `perf::status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50064
diff changeset
   827
            with dirstate.running_status(repo):
ec3631290eb7 contrib-perf: use `running_status` in `perf::status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50064
diff changeset
   828
                timer(status_dirstate)
ec3631290eb7 contrib-perf: use `running_status` in `perf::status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50064
diff changeset
   829
                dirstate.invalidate()
ec3631290eb7 contrib-perf: use `running_status` in `perf::status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50064
diff changeset
   830
        else:
ec3631290eb7 contrib-perf: use `running_status` in `perf::status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50064
diff changeset
   831
            timer(status_dirstate)
43488
bfc68404cccd perf: add a way to benchmark `dirstate.status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43197
diff changeset
   832
    else:
bfc68404cccd perf: add a way to benchmark `dirstate.status`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43197
diff changeset
   833
        timer(lambda: sum(map(len, repo.status(unknown=opts[b'unknown']))))
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
   834
    fm.end()
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   835
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   836
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
   837
@command(b'perf::addremove|perfaddremove', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
   838
def perfaddremove(ui, repo, **opts):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
   839
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
   840
    timer, fm = gettimer(ui, opts)
18871
a2d4ab4f575d perf: add a command to test addremove performance
Siddharth Agarwal <sid0@fb.com>
parents: 18845
diff changeset
   841
    try:
a2d4ab4f575d perf: add a command to test addremove performance
Siddharth Agarwal <sid0@fb.com>
parents: 18845
diff changeset
   842
        oldquiet = repo.ui.quiet
a2d4ab4f575d perf: add a command to test addremove performance
Siddharth Agarwal <sid0@fb.com>
parents: 18845
diff changeset
   843
        repo.ui.quiet = True
23533
891aaa7c0c70 scmutil: pass a matcher to scmutil.addremove() instead of a list of patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 23485
diff changeset
   844
        matcher = scmutil.match(repo[None])
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   845
        opts[b'dry_run'] = True
45635
7d0e54056586 py3: use native string when comparing with a function's argspec
Raphaël Gomès <rgomes@octobus.net>
parents: 45016
diff changeset
   846
        if 'uipathfn' in getargspec(scmutil.addremove).args:
41663
6a447a3d1bd0 addremove: pass around uipathfn and use instead of m.uipath() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41626
diff changeset
   847
            uipathfn = scmutil.getuipathfn(repo)
6a447a3d1bd0 addremove: pass around uipathfn and use instead of m.uipath() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41626
diff changeset
   848
            timer(lambda: scmutil.addremove(repo, matcher, b"", uipathfn, opts))
6a447a3d1bd0 addremove: pass around uipathfn and use instead of m.uipath() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41626
diff changeset
   849
        else:
6a447a3d1bd0 addremove: pass around uipathfn and use instead of m.uipath() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41626
diff changeset
   850
            timer(lambda: scmutil.addremove(repo, matcher, b"", opts))
18871
a2d4ab4f575d perf: add a command to test addremove performance
Siddharth Agarwal <sid0@fb.com>
parents: 18845
diff changeset
   851
    finally:
a2d4ab4f575d perf: add a command to test addremove performance
Siddharth Agarwal <sid0@fb.com>
parents: 18845
diff changeset
   852
        repo.ui.quiet = oldquiet
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
   853
        fm.end()
18871
a2d4ab4f575d perf: add a command to test addremove performance
Siddharth Agarwal <sid0@fb.com>
parents: 18845
diff changeset
   854
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   855
16785
1dc08dc63c09 perf: rework perfheads and perftags to clear caches
Bryan O'Sullivan <bryano@fb.com>
parents: 16689
diff changeset
   856
def clearcaches(cl):
1dc08dc63c09 perf: rework perfheads and perftags to clear caches
Bryan O'Sullivan <bryano@fb.com>
parents: 16689
diff changeset
   857
    # behave somewhat consistently across internal API changes
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   858
    if util.safehasattr(cl, b'clearcaches'):
16785
1dc08dc63c09 perf: rework perfheads and perftags to clear caches
Bryan O'Sullivan <bryano@fb.com>
parents: 16689
diff changeset
   859
        cl.clearcaches()
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
   860
    elif util.safehasattr(cl, b'_nodecache'):
43575
43424f03d9a4 revlog: clarify which version use the older API in perf
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43574
diff changeset
   861
        # <= hg-5.2
16785
1dc08dc63c09 perf: rework perfheads and perftags to clear caches
Bryan O'Sullivan <bryano@fb.com>
parents: 16689
diff changeset
   862
        from mercurial.node import nullid, nullrev
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   863
16785
1dc08dc63c09 perf: rework perfheads and perftags to clear caches
Bryan O'Sullivan <bryano@fb.com>
parents: 16689
diff changeset
   864
        cl._nodecache = {nullid: nullrev}
1dc08dc63c09 perf: rework perfheads and perftags to clear caches
Bryan O'Sullivan <bryano@fb.com>
parents: 16689
diff changeset
   865
        cl._nodepos = None
1dc08dc63c09 perf: rework perfheads and perftags to clear caches
Bryan O'Sullivan <bryano@fb.com>
parents: 16689
diff changeset
   866
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   867
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
   868
@command(b'perf::heads|perfheads', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
   869
def perfheads(ui, repo, **opts):
41456
48394923fbdc perf: document perfheads
Boris Feld <boris.feld@octobus.net>
parents: 41387
diff changeset
   870
    """benchmark the computation of a changelog heads"""
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
   871
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
   872
    timer, fm = gettimer(ui, opts)
16785
1dc08dc63c09 perf: rework perfheads and perftags to clear caches
Bryan O'Sullivan <bryano@fb.com>
parents: 16689
diff changeset
   873
    cl = repo.changelog
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   874
41458
ab6d1f82be32 perf: move cache clearing in the `setup` step of `perfheads`
Boris Feld <boris.feld@octobus.net>
parents: 41456
diff changeset
   875
    def s():
ab6d1f82be32 perf: move cache clearing in the `setup` step of `perfheads`
Boris Feld <boris.feld@octobus.net>
parents: 41456
diff changeset
   876
        clearcaches(cl)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   877
16785
1dc08dc63c09 perf: rework perfheads and perftags to clear caches
Bryan O'Sullivan <bryano@fb.com>
parents: 16689
diff changeset
   878
    def d():
1dc08dc63c09 perf: rework perfheads and perftags to clear caches
Bryan O'Sullivan <bryano@fb.com>
parents: 16689
diff changeset
   879
        len(cl.headrevs())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   880
41458
ab6d1f82be32 perf: move cache clearing in the `setup` step of `perfheads`
Boris Feld <boris.feld@octobus.net>
parents: 41456
diff changeset
   881
    timer(d, setup=s)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
   882
    fm.end()
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   883
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   884
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   885
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
   886
    b'perf::tags|perftags',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   887
    formatteropts
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   888
    + [
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   889
        (b'', b'clear-revlogs', False, b'refresh changelog and manifest'),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
   890
    ],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   891
)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
   892
def perftags(ui, repo, **opts):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
   893
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
   894
    timer, fm = gettimer(ui, opts)
30150
c0410814002f perf: make perftags clear tags cache correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30149
diff changeset
   895
    repocleartagscache = repocleartagscachefunc(repo)
40778
594e84a2e574 perf: add a `clear-revlogs` flag to `perftags`
Boris Feld <boris.feld@octobus.net>
parents: 40777
diff changeset
   896
    clearrevlogs = opts[b'clear_revlogs']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   897
40721
4369c00a8ee1 perf: move some of the perftags benchmark to the setup function
Boris Feld <boris.feld@octobus.net>
parents: 40720
diff changeset
   898
    def s():
40778
594e84a2e574 perf: add a `clear-revlogs` flag to `perftags`
Boris Feld <boris.feld@octobus.net>
parents: 40777
diff changeset
   899
        if clearrevlogs:
594e84a2e574 perf: add a `clear-revlogs` flag to `perftags`
Boris Feld <boris.feld@octobus.net>
parents: 40777
diff changeset
   900
            clearchangelog(repo)
594e84a2e574 perf: add a `clear-revlogs` flag to `perftags`
Boris Feld <boris.feld@octobus.net>
parents: 40777
diff changeset
   901
            clearfilecache(repo.unfiltered(), 'manifest')
30150
c0410814002f perf: make perftags clear tags cache correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30149
diff changeset
   902
        repocleartagscache()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   903
40721
4369c00a8ee1 perf: move some of the perftags benchmark to the setup function
Boris Feld <boris.feld@octobus.net>
parents: 40720
diff changeset
   904
    def t():
50762
d2f72f702de2 perf: fix perf::tags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50705
diff changeset
   905
        len(repo.tags())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   906
40721
4369c00a8ee1 perf: move some of the perftags benchmark to the setup function
Boris Feld <boris.feld@octobus.net>
parents: 40720
diff changeset
   907
    timer(t, setup=s)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
   908
    fm.end()
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   909
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   910
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
   911
@command(b'perf::ancestors|perfancestors', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
   912
def perfancestors(ui, repo, **opts):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
   913
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
   914
    timer, fm = gettimer(ui, opts)
16802
7e5d94381cd1 perf: add a perfancestors benchmark
Bryan O'Sullivan <bryano@fb.com>
parents: 16788
diff changeset
   915
    heads = repo.changelog.headrevs()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   916
16802
7e5d94381cd1 perf: add a perfancestors benchmark
Bryan O'Sullivan <bryano@fb.com>
parents: 16788
diff changeset
   917
    def d():
16866
91f3ac205816 revlog: ancestors(*revs) becomes ancestors(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents: 16858
diff changeset
   918
        for a in repo.changelog.ancestors(heads):
16802
7e5d94381cd1 perf: add a perfancestors benchmark
Bryan O'Sullivan <bryano@fb.com>
parents: 16788
diff changeset
   919
            pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   920
16802
7e5d94381cd1 perf: add a perfancestors benchmark
Bryan O'Sullivan <bryano@fb.com>
parents: 16788
diff changeset
   921
    timer(d)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
   922
    fm.end()
16802
7e5d94381cd1 perf: add a perfancestors benchmark
Bryan O'Sullivan <bryano@fb.com>
parents: 16788
diff changeset
   923
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   924
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
   925
@command(b'perf::ancestorset|perfancestorset', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
   926
def perfancestorset(ui, repo, revset, **opts):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
   927
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
   928
    timer, fm = gettimer(ui, opts)
18080
486bfb200b3f perf: add command to test performance of membership in ancestor set
Siddharth Agarwal <sid0@fb.com>
parents: 18062
diff changeset
   929
    revs = repo.revs(revset)
486bfb200b3f perf: add command to test performance of membership in ancestor set
Siddharth Agarwal <sid0@fb.com>
parents: 18062
diff changeset
   930
    heads = repo.changelog.headrevs()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   931
18080
486bfb200b3f perf: add command to test performance of membership in ancestor set
Siddharth Agarwal <sid0@fb.com>
parents: 18062
diff changeset
   932
    def d():
18091
f7f8159caad3 ancestor: add lazy membership testing to lazyancestors
Siddharth Agarwal <sid0@fb.com>
parents: 18080
diff changeset
   933
        s = repo.changelog.ancestors(heads)
18080
486bfb200b3f perf: add command to test performance of membership in ancestor set
Siddharth Agarwal <sid0@fb.com>
parents: 18062
diff changeset
   934
        for rev in revs:
486bfb200b3f perf: add command to test performance of membership in ancestor set
Siddharth Agarwal <sid0@fb.com>
parents: 18062
diff changeset
   935
            rev in s
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   936
18080
486bfb200b3f perf: add command to test performance of membership in ancestor set
Siddharth Agarwal <sid0@fb.com>
parents: 18062
diff changeset
   937
    timer(d)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
   938
    fm.end()
18080
486bfb200b3f perf: add command to test performance of membership in ancestor set
Siddharth Agarwal <sid0@fb.com>
parents: 18062
diff changeset
   939
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
   940
49464
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   941
@command(
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   942
    b'perf::delta-find',
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   943
    revlogopts + formatteropts,
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   944
    b'-c|-m|FILE REV',
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   945
)
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   946
def perf_delta_find(ui, repo, arg_1, arg_2=None, **opts):
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   947
    """benchmark the process of finding a valid delta for a revlog revision
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   948
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   949
    When a revlog receives a new revision (e.g. from a commit, or from an
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   950
    incoming bundle), it searches for a suitable delta-base to produce a delta.
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   951
    This perf command measures how much time we spend in this process. It
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   952
    operates on an already stored revision.
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   953
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   954
    See `hg help debug-delta-find` for another related command.
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   955
    """
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   956
    from mercurial import revlogutils
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   957
    import mercurial.revlogutils.deltas as deltautil
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   958
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   959
    opts = _byteskwargs(opts)
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   960
    if arg_2 is None:
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   961
        file_ = None
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   962
        rev = arg_1
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   963
    else:
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   964
        file_ = arg_1
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   965
        rev = arg_2
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   966
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   967
    repo = repo.unfiltered()
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   968
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   969
    timer, fm = gettimer(ui, opts)
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   970
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   971
    rev = int(rev)
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   972
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   973
    revlog = cmdutil.openrevlog(repo, b'perf::delta-find', file_, opts)
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   974
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   975
    deltacomputer = deltautil.deltacomputer(revlog)
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   976
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   977
    node = revlog.node(rev)
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   978
    p1r, p2r = revlog.parentrevs(rev)
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   979
    p1 = revlog.node(p1r)
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   980
    p2 = revlog.node(p2r)
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   981
    full_text = revlog.revision(rev)
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   982
    textlen = len(full_text)
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   983
    cachedelta = None
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   984
    flags = revlog.flags(rev)
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   985
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   986
    revinfo = revlogutils.revisioninfo(
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   987
        node,
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   988
        p1,
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   989
        p2,
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   990
        [full_text],  # btext
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   991
        textlen,
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   992
        cachedelta,
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   993
        flags,
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   994
    )
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   995
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   996
    # Note: we should probably purge the potential caches (like the full
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   997
    # manifest cache) between runs.
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   998
    def find_one():
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
   999
        with revlog._datafp() as fh:
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
  1000
            deltacomputer.finddeltainfo(revinfo, fh, target_rev=rev)
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
  1001
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
  1002
    timer(find_one)
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
  1003
    fm.end()
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
  1004
44d4fd09982f perf: introduce a benchmark for delta-find
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49447
diff changeset
  1005
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1006
@command(b'perf::discovery|perfdiscovery', formatteropts, b'PATH')
40954
db6cace18765 perfdiscovery: benching findcommonheads()
Georges Racinet <gracinet@anybox.fr>
parents: 40943
diff changeset
  1007
def perfdiscovery(ui, repo, path, **opts):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  1008
    """benchmark discovery between local repo and the peer at given path"""
40954
db6cace18765 perfdiscovery: benching findcommonheads()
Georges Racinet <gracinet@anybox.fr>
parents: 40943
diff changeset
  1009
    repos = [repo, None]
db6cace18765 perfdiscovery: benching findcommonheads()
Georges Racinet <gracinet@anybox.fr>
parents: 40943
diff changeset
  1010
    timer, fm = gettimer(ui, opts)
46973
92029a43debb perf-discovery: use `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46793
diff changeset
  1011
92029a43debb perf-discovery: use `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46793
diff changeset
  1012
    try:
49849
4cedae992ed1 path: pass `path` to `peer` in `hg perf::discovery`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49817
diff changeset
  1013
        from mercurial.utils.urlutil import get_unique_pull_path_obj
4cedae992ed1 path: pass `path` to `peer` in `hg perf::discovery`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49817
diff changeset
  1014
4cedae992ed1 path: pass `path` to `peer` in `hg perf::discovery`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49817
diff changeset
  1015
        path = get_unique_pull_path_obj(b'perfdiscovery', ui, path)
46973
92029a43debb perf-discovery: use `get_unique_pull_path`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46793
diff changeset
  1016
    except ImportError:
49849
4cedae992ed1 path: pass `path` to `peer` in `hg perf::discovery`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49817
diff changeset
  1017
        try:
4cedae992ed1 path: pass `path` to `peer` in `hg perf::discovery`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49817
diff changeset
  1018
            from mercurial.utils.urlutil import get_unique_pull_path
4cedae992ed1 path: pass `path` to `peer` in `hg perf::discovery`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49817
diff changeset
  1019
4cedae992ed1 path: pass `path` to `peer` in `hg perf::discovery`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49817
diff changeset
  1020
            path = get_unique_pull_path(b'perfdiscovery', repo, ui, path)[0]
4cedae992ed1 path: pass `path` to `peer` in `hg perf::discovery`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49817
diff changeset
  1021
        except ImportError:
4cedae992ed1 path: pass `path` to `peer` in `hg perf::discovery`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49817
diff changeset
  1022
            path = ui.expandpath(path)
40954
db6cace18765 perfdiscovery: benching findcommonheads()
Georges Racinet <gracinet@anybox.fr>
parents: 40943
diff changeset
  1023
db6cace18765 perfdiscovery: benching findcommonheads()
Georges Racinet <gracinet@anybox.fr>
parents: 40943
diff changeset
  1024
    def s():
db6cace18765 perfdiscovery: benching findcommonheads()
Georges Racinet <gracinet@anybox.fr>
parents: 40943
diff changeset
  1025
        repos[1] = hg.peer(ui, opts, path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1026
40954
db6cace18765 perfdiscovery: benching findcommonheads()
Georges Racinet <gracinet@anybox.fr>
parents: 40943
diff changeset
  1027
    def d():
db6cace18765 perfdiscovery: benching findcommonheads()
Georges Racinet <gracinet@anybox.fr>
parents: 40943
diff changeset
  1028
        setdiscovery.findcommonheads(ui, *repos)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1029
40954
db6cace18765 perfdiscovery: benching findcommonheads()
Georges Racinet <gracinet@anybox.fr>
parents: 40943
diff changeset
  1030
    timer(d, setup=s)
db6cace18765 perfdiscovery: benching findcommonheads()
Georges Racinet <gracinet@anybox.fr>
parents: 40943
diff changeset
  1031
    fm.end()
db6cace18765 perfdiscovery: benching findcommonheads()
Georges Racinet <gracinet@anybox.fr>
parents: 40943
diff changeset
  1032
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1033
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1034
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1035
    b'perf::bookmarks|perfbookmarks',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1036
    formatteropts
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  1037
    + [
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  1038
        (b'', b'clear-revlogs', False, b'refresh changelog and manifest'),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  1039
    ],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1040
)
32753
2b0a8b0f3435 perf: add a perfbookmarks command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32752
diff changeset
  1041
def perfbookmarks(ui, repo, **opts):
2b0a8b0f3435 perf: add a perfbookmarks command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32752
diff changeset
  1042
    """benchmark parsing bookmarks from disk to memory"""
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  1043
    opts = _byteskwargs(opts)
32753
2b0a8b0f3435 perf: add a perfbookmarks command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32752
diff changeset
  1044
    timer, fm = gettimer(ui, opts)
40720
c0a1686d9391 perf: use the new setup function in "perfbookmarks"
Boris Feld <boris.feld@octobus.net>
parents: 40719
diff changeset
  1045
40780
82c189c511bd perf: add a `clear-revlogs` flag to `perfbookmarks`
Boris Feld <boris.feld@octobus.net>
parents: 40778
diff changeset
  1046
    clearrevlogs = opts[b'clear_revlogs']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1047
40720
c0a1686d9391 perf: use the new setup function in "perfbookmarks"
Boris Feld <boris.feld@octobus.net>
parents: 40719
diff changeset
  1048
    def s():
40780
82c189c511bd perf: add a `clear-revlogs` flag to `perfbookmarks`
Boris Feld <boris.feld@octobus.net>
parents: 40778
diff changeset
  1049
        if clearrevlogs:
82c189c511bd perf: add a `clear-revlogs` flag to `perfbookmarks`
Boris Feld <boris.feld@octobus.net>
parents: 40778
diff changeset
  1050
            clearchangelog(repo)
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1051
        clearfilecache(repo, b'_bookmarks')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1052
40720
c0a1686d9391 perf: use the new setup function in "perfbookmarks"
Boris Feld <boris.feld@octobus.net>
parents: 40719
diff changeset
  1053
    def d():
32753
2b0a8b0f3435 perf: add a perfbookmarks command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32752
diff changeset
  1054
        repo._bookmarks
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1055
40720
c0a1686d9391 perf: use the new setup function in "perfbookmarks"
Boris Feld <boris.feld@octobus.net>
parents: 40719
diff changeset
  1056
    timer(d, setup=s)
32753
2b0a8b0f3435 perf: add a perfbookmarks command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32752
diff changeset
  1057
    fm.end()
2b0a8b0f3435 perf: add a perfbookmarks command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32752
diff changeset
  1058
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1059
49445
3635aae8b2e9 perf-bundle: accept --rev arguments
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49444
diff changeset
  1060
@command(
3635aae8b2e9 perf-bundle: accept --rev arguments
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49444
diff changeset
  1061
    b'perf::bundle',
3635aae8b2e9 perf-bundle: accept --rev arguments
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49444
diff changeset
  1062
    [
3635aae8b2e9 perf-bundle: accept --rev arguments
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49444
diff changeset
  1063
        (
3635aae8b2e9 perf-bundle: accept --rev arguments
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49444
diff changeset
  1064
            b'r',
3635aae8b2e9 perf-bundle: accept --rev arguments
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49444
diff changeset
  1065
            b'rev',
3635aae8b2e9 perf-bundle: accept --rev arguments
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49444
diff changeset
  1066
            [],
3635aae8b2e9 perf-bundle: accept --rev arguments
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49444
diff changeset
  1067
            b'changesets to bundle',
3635aae8b2e9 perf-bundle: accept --rev arguments
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49444
diff changeset
  1068
            b'REV',
3635aae8b2e9 perf-bundle: accept --rev arguments
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49444
diff changeset
  1069
        ),
49446
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1070
        (
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1071
            b't',
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1072
            b'type',
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1073
            b'none',
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1074
            b'bundlespec to use (see `hg help bundlespec`)',
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1075
            b'TYPE',
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1076
        ),
49445
3635aae8b2e9 perf-bundle: accept --rev arguments
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49444
diff changeset
  1077
    ]
3635aae8b2e9 perf-bundle: accept --rev arguments
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49444
diff changeset
  1078
    + formatteropts,
3635aae8b2e9 perf-bundle: accept --rev arguments
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49444
diff changeset
  1079
    b'REVS',
3635aae8b2e9 perf-bundle: accept --rev arguments
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49444
diff changeset
  1080
)
49444
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1081
def perfbundle(ui, repo, *revs, **opts):
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1082
    """benchmark the creation of a bundle from a repository
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1083
49446
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1084
    For now, this only supports "none" compression.
49444
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1085
    """
49489
d513ae93dff3 perf: make perf::bundle compatible down to 5.2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49488
diff changeset
  1086
    try:
d513ae93dff3 perf: make perf::bundle compatible down to 5.2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49488
diff changeset
  1087
        from mercurial import bundlecaches
d513ae93dff3 perf: make perf::bundle compatible down to 5.2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49488
diff changeset
  1088
d513ae93dff3 perf: make perf::bundle compatible down to 5.2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49488
diff changeset
  1089
        parsebundlespec = bundlecaches.parsebundlespec
d513ae93dff3 perf: make perf::bundle compatible down to 5.2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49488
diff changeset
  1090
    except ImportError:
d513ae93dff3 perf: make perf::bundle compatible down to 5.2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49488
diff changeset
  1091
        from mercurial import exchange
d513ae93dff3 perf: make perf::bundle compatible down to 5.2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49488
diff changeset
  1092
d513ae93dff3 perf: make perf::bundle compatible down to 5.2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49488
diff changeset
  1093
        parsebundlespec = exchange.parsebundlespec
d513ae93dff3 perf: make perf::bundle compatible down to 5.2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49488
diff changeset
  1094
49444
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1095
    from mercurial import discovery
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1096
    from mercurial import bundle2
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1097
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1098
    opts = _byteskwargs(opts)
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1099
    timer, fm = gettimer(ui, opts)
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1100
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1101
    cl = repo.changelog
49445
3635aae8b2e9 perf-bundle: accept --rev arguments
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49444
diff changeset
  1102
    revs = list(revs)
3635aae8b2e9 perf-bundle: accept --rev arguments
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49444
diff changeset
  1103
    revs.extend(opts.get(b'rev', ()))
49444
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1104
    revs = scmutil.revrange(repo, revs)
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1105
    if not revs:
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1106
        raise error.Abort(b"not revision specified")
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1107
    # make it a consistent set (ie: without topological gaps)
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1108
    old_len = len(revs)
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1109
    revs = list(repo.revs(b"%ld::%ld", revs, revs))
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1110
    if old_len != len(revs):
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1111
        new_count = len(revs) - old_len
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1112
        msg = b"add %d new revisions to make it a consistent set\n"
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1113
        ui.write_err(msg % new_count)
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1114
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1115
    targets = [cl.node(r) for r in repo.revs(b"heads(::%ld)", revs)]
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1116
    bases = [cl.node(r) for r in repo.revs(b"heads(::%ld - %ld)", revs, revs)]
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1117
    outgoing = discovery.outgoing(repo, bases, targets)
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1118
49446
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1119
    bundle_spec = opts.get(b'type')
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1120
49488
a7a5740b322a perf: make perf::bundle compatible before 61ba04693d65
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49471
diff changeset
  1121
    bundle_spec = parsebundlespec(repo, bundle_spec, strict=False)
a7a5740b322a perf: make perf::bundle compatible before 61ba04693d65
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49471
diff changeset
  1122
a7a5740b322a perf: make perf::bundle compatible before 61ba04693d65
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49471
diff changeset
  1123
    cgversion = bundle_spec.params.get(b"cg.version")
a7a5740b322a perf: make perf::bundle compatible before 61ba04693d65
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49471
diff changeset
  1124
    if cgversion is None:
a7a5740b322a perf: make perf::bundle compatible before 61ba04693d65
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49471
diff changeset
  1125
        if bundle_spec.version == b'v1':
a7a5740b322a perf: make perf::bundle compatible before 61ba04693d65
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49471
diff changeset
  1126
            cgversion = b'01'
a7a5740b322a perf: make perf::bundle compatible before 61ba04693d65
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49471
diff changeset
  1127
        if bundle_spec.version == b'v2':
a7a5740b322a perf: make perf::bundle compatible before 61ba04693d65
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49471
diff changeset
  1128
            cgversion = b'02'
49446
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1129
    if cgversion not in changegroup.supportedoutgoingversions(repo):
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1130
        err = b"repository does not support bundle version %s"
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1131
        raise error.Abort(err % cgversion)
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1132
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1133
    if cgversion == b'01':  # bundle1
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1134
        bversion = b'HG10' + bundle_spec.wirecompression
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1135
        bcompression = None
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1136
    elif cgversion in (b'02', b'03'):
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1137
        bversion = b'HG20'
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1138
        bcompression = bundle_spec.wirecompression
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1139
    else:
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1140
        err = b'perf::bundle: unexpected changegroup version %s'
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1141
        raise error.ProgrammingError(err % cgversion)
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1142
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1143
    if bcompression is None:
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1144
        bcompression = b'UN'
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1145
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1146
    if bcompression != b'UN':
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1147
        err = b'perf::bundle: compression currently unsupported: %s'
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1148
        raise error.ProgrammingError(err % bcompression)
49444
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1149
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1150
    def do_bundle():
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1151
        bundle2.writenewbundle(
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1152
            ui,
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1153
            repo,
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1154
            b'perf::bundle',
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1155
            os.devnull,
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1156
            bversion,
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1157
            outgoing,
49446
b380583ad2f5 perf-bundle: accept --type argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49445
diff changeset
  1158
            bundle_spec.params,
49444
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1159
        )
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1160
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1161
    timer(do_bundle)
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1162
    fm.end()
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1163
b081a5aab782 perf-bundle: add a new command to benchmark bundle creation time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
  1164
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1165
@command(b'perf::bundleread|perfbundleread', formatteropts, b'BUNDLE')
35132
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1166
def perfbundleread(ui, repo, bundlepath, **opts):
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1167
    """Benchmark reading of bundle files.
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1168
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1169
    This command is meant to isolate the I/O part of bundle reading as
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1170
    much as possible.
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1171
    """
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1172
    from mercurial import (
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1173
        bundle2,
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1174
        exchange,
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1175
        streamclone,
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1176
    )
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1177
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  1178
    opts = _byteskwargs(opts)
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  1179
35132
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1180
    def makebench(fn):
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1181
        def run():
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1182
            with open(bundlepath, b'rb') as fh:
35132
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1183
                bundle = exchange.readbundle(ui, fh, bundlepath)
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1184
                fn(bundle)
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1185
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1186
        return run
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1187
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1188
    def makereadnbytes(size):
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1189
        def run():
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1190
            with open(bundlepath, b'rb') as fh:
35132
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1191
                bundle = exchange.readbundle(ui, fh, bundlepath)
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1192
                while bundle.read(size):
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1193
                    pass
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1194
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1195
        return run
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1196
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1197
    def makestdioread(size):
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1198
        def run():
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1199
            with open(bundlepath, b'rb') as fh:
35132
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1200
                while fh.read(size):
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1201
                    pass
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1202
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1203
        return run
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1204
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1205
    # bundle1
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1206
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1207
    def deltaiter(bundle):
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1208
        for delta in bundle.deltaiter():
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1209
            pass
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1210
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1211
    def iterchunks(bundle):
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1212
        for chunk in bundle.getchunks():
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1213
            pass
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1214
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1215
    # bundle2
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1216
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1217
    def forwardchunks(bundle):
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1218
        for chunk in bundle._forwardchunks():
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1219
            pass
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1220
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1221
    def iterparts(bundle):
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1222
        for part in bundle.iterparts():
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1223
            pass
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1224
35137
da91e7309daf bundle2: don't use seekable bundle2 parts by default (issue5691)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35132
diff changeset
  1225
    def iterpartsseekable(bundle):
da91e7309daf bundle2: don't use seekable bundle2 parts by default (issue5691)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35132
diff changeset
  1226
        for part in bundle.iterparts(seekable=True):
da91e7309daf bundle2: don't use seekable bundle2 parts by default (issue5691)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35132
diff changeset
  1227
            pass
da91e7309daf bundle2: don't use seekable bundle2 parts by default (issue5691)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35132
diff changeset
  1228
35132
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1229
    def seek(bundle):
35137
da91e7309daf bundle2: don't use seekable bundle2 parts by default (issue5691)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35132
diff changeset
  1230
        for part in bundle.iterparts(seekable=True):
35132
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1231
            part.seek(0, os.SEEK_END)
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1232
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1233
    def makepartreadnbytes(size):
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1234
        def run():
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1235
            with open(bundlepath, b'rb') as fh:
35132
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1236
                bundle = exchange.readbundle(ui, fh, bundlepath)
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1237
                for part in bundle.iterparts():
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1238
                    while part.read(size):
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1239
                        pass
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1240
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1241
        return run
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1242
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1243
    benches = [
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1244
        (makestdioread(8192), b'read(8k)'),
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1245
        (makestdioread(16384), b'read(16k)'),
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1246
        (makestdioread(32768), b'read(32k)'),
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1247
        (makestdioread(131072), b'read(128k)'),
35132
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1248
    ]
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1249
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1250
    with open(bundlepath, b'rb') as fh:
35132
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1251
        bundle = exchange.readbundle(ui, fh, bundlepath)
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1252
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1253
        if isinstance(bundle, changegroup.cg1unpacker):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1254
            benches.extend(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1255
                [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1256
                    (makebench(deltaiter), b'cg1 deltaiter()'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1257
                    (makebench(iterchunks), b'cg1 getchunks()'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1258
                    (makereadnbytes(8192), b'cg1 read(8k)'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1259
                    (makereadnbytes(16384), b'cg1 read(16k)'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1260
                    (makereadnbytes(32768), b'cg1 read(32k)'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1261
                    (makereadnbytes(131072), b'cg1 read(128k)'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1262
                ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1263
            )
35132
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1264
        elif isinstance(bundle, bundle2.unbundle20):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1265
            benches.extend(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1266
                [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1267
                    (makebench(forwardchunks), b'bundle2 forwardchunks()'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1268
                    (makebench(iterparts), b'bundle2 iterparts()'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1269
                    (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1270
                        makebench(iterpartsseekable),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1271
                        b'bundle2 iterparts() seekable',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1272
                    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1273
                    (makebench(seek), b'bundle2 part seek()'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1274
                    (makepartreadnbytes(8192), b'bundle2 part read(8k)'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1275
                    (makepartreadnbytes(16384), b'bundle2 part read(16k)'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1276
                    (makepartreadnbytes(32768), b'bundle2 part read(32k)'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1277
                    (makepartreadnbytes(131072), b'bundle2 part read(128k)'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1278
                ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1279
            )
35132
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1280
        elif isinstance(bundle, streamclone.streamcloneapplier):
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1281
            raise error.Abort(b'stream clone bundles not supported')
35132
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1282
        else:
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1283
            raise error.Abort(b'unhandled bundle type: %s' % type(bundle))
35132
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1284
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1285
    for fn, title in benches:
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1286
        timer, fm = gettimer(ui, opts)
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1287
        timer(fn, title=title)
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1288
        fm.end()
e96613048bdd perf: add command to benchmark bundle reading
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35107
diff changeset
  1289
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1290
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1291
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1292
    b'perf::changegroupchangelog|perfchangegroupchangelog',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1293
    formatteropts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1294
    + [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1295
        (b'', b'cgversion', b'02', b'changegroup version'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1296
        (b'r', b'rev', b'', b'revisions to add to changegroup'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1297
    ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1298
)
40752
cfaf3843491b perf: rename version flag of perfchangegroupchangelog to cgversion
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40741
diff changeset
  1299
def perfchangegroupchangelog(ui, repo, cgversion=b'02', rev=None, **opts):
30020
bd6df07ccc24 perf: add perfchangegroupchangelog command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30019
diff changeset
  1300
    """Benchmark producing a changelog group for a changegroup.
bd6df07ccc24 perf: add perfchangegroupchangelog command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30019
diff changeset
  1301
bd6df07ccc24 perf: add perfchangegroupchangelog command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30019
diff changeset
  1302
    This measures the time spent processing the changelog during a
bd6df07ccc24 perf: add perfchangegroupchangelog command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30019
diff changeset
  1303
    bundle operation. This occurs during `hg bundle` and on a server
bd6df07ccc24 perf: add perfchangegroupchangelog command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30019
diff changeset
  1304
    processing a `getbundle` wire protocol request (handles clones
bd6df07ccc24 perf: add perfchangegroupchangelog command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30019
diff changeset
  1305
    and pull requests).
bd6df07ccc24 perf: add perfchangegroupchangelog command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30019
diff changeset
  1306
bd6df07ccc24 perf: add perfchangegroupchangelog command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30019
diff changeset
  1307
    By default, all revisions are added to the changegroup.
bd6df07ccc24 perf: add perfchangegroupchangelog command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30019
diff changeset
  1308
    """
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  1309
    opts = _byteskwargs(opts)
30020
bd6df07ccc24 perf: add perfchangegroupchangelog command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30019
diff changeset
  1310
    cl = repo.changelog
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1311
    nodes = [cl.lookup(r) for r in repo.revs(rev or b'all()')]
40752
cfaf3843491b perf: rename version flag of perfchangegroupchangelog to cgversion
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40741
diff changeset
  1312
    bundler = changegroup.getbundler(cgversion, repo)
30020
bd6df07ccc24 perf: add perfchangegroupchangelog command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30019
diff changeset
  1313
bd6df07ccc24 perf: add perfchangegroupchangelog command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30019
diff changeset
  1314
    def d():
39015
a1f694779b2f perf: call _generatechangelog() instead of group()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39007
diff changeset
  1315
        state, chunks = bundler._generatechangelog(cl, nodes)
a1f694779b2f perf: call _generatechangelog() instead of group()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39007
diff changeset
  1316
        for chunk in chunks:
30020
bd6df07ccc24 perf: add perfchangegroupchangelog command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30019
diff changeset
  1317
            pass
bd6df07ccc24 perf: add perfchangegroupchangelog command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30019
diff changeset
  1318
bd6df07ccc24 perf: add perfchangegroupchangelog command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30019
diff changeset
  1319
    timer, fm = gettimer(ui, opts)
39015
a1f694779b2f perf: call _generatechangelog() instead of group()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39007
diff changeset
  1320
a1f694779b2f perf: call _generatechangelog() instead of group()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39007
diff changeset
  1321
    # Terminal printing can interfere with timing. So disable it.
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1322
    with ui.configoverride({(b'progress', b'disable'): True}):
39015
a1f694779b2f perf: call _generatechangelog() instead of group()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39007
diff changeset
  1323
        timer(d)
a1f694779b2f perf: call _generatechangelog() instead of group()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39007
diff changeset
  1324
30020
bd6df07ccc24 perf: add perfchangegroupchangelog command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30019
diff changeset
  1325
    fm.end()
bd6df07ccc24 perf: add perfchangegroupchangelog command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30019
diff changeset
  1326
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1327
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1328
@command(b'perf::dirs|perfdirs', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1329
def perfdirs(ui, repo, **opts):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  1330
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1331
    timer, fm = gettimer(ui, opts)
18845
c1f416e4bc80 perf: add perfdirs command
Bryan O'Sullivan <bryano@fb.com>
parents: 18837
diff changeset
  1332
    dirstate = repo.dirstate
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1333
    b'a' in dirstate
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1334
18845
c1f416e4bc80 perf: add perfdirs command
Bryan O'Sullivan <bryano@fb.com>
parents: 18837
diff changeset
  1335
    def d():
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1336
        dirstate.hasdir(b'a')
47482
eb416759af7e dirstate: Removed unused instances of `DirsMultiset`
Simon Sapin <simon.sapin@octobus.net>
parents: 47164
diff changeset
  1337
        try:
eb416759af7e dirstate: Removed unused instances of `DirsMultiset`
Simon Sapin <simon.sapin@octobus.net>
parents: 47164
diff changeset
  1338
            del dirstate._map._dirs
eb416759af7e dirstate: Removed unused instances of `DirsMultiset`
Simon Sapin <simon.sapin@octobus.net>
parents: 47164
diff changeset
  1339
        except AttributeError:
eb416759af7e dirstate: Removed unused instances of `DirsMultiset`
Simon Sapin <simon.sapin@octobus.net>
parents: 47164
diff changeset
  1340
            pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1341
18845
c1f416e4bc80 perf: add perfdirs command
Bryan O'Sullivan <bryano@fb.com>
parents: 18837
diff changeset
  1342
    timer(d)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  1343
    fm.end()
18845
c1f416e4bc80 perf: add perfdirs command
Bryan O'Sullivan <bryano@fb.com>
parents: 18837
diff changeset
  1344
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1345
43197
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1346
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1347
    b'perf::dirstate|perfdirstate',
43197
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1348
    [
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1349
        (
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1350
            b'',
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1351
            b'iteration',
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1352
            None,
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1353
            b'benchmark a full iteration for the dirstate',
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1354
        ),
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1355
        (
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1356
            b'',
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1357
            b'contains',
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1358
            None,
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1359
            b'benchmark a large amount of `nf in dirstate` calls',
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1360
        ),
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1361
    ]
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1362
    + formatteropts,
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1363
)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1364
def perfdirstate(ui, repo, **opts):
43196
5f9b1250b82a perf: introduce a `--iteration` to `perfdirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43161
diff changeset
  1365
    """benchmap the time of various distate operations
5f9b1250b82a perf: introduce a `--iteration` to `perfdirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43161
diff changeset
  1366
5f9b1250b82a perf: introduce a `--iteration` to `perfdirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43161
diff changeset
  1367
    By default benchmark the time necessary to load a dirstate from scratch.
43121
ce315b1fc9a7 perf: document `perfdirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43120
diff changeset
  1368
    The dirstate is loaded to the point were a "contains" request can be
ce315b1fc9a7 perf: document `perfdirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43120
diff changeset
  1369
    answered.
ce315b1fc9a7 perf: document `perfdirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43120
diff changeset
  1370
    """
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  1371
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1372
    timer, fm = gettimer(ui, opts)
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1373
    b"a" in repo.dirstate
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1374
43197
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1375
    if opts[b'iteration'] and opts[b'contains']:
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1376
        msg = b'only specify one of --iteration or --contains'
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1377
        raise error.Abort(msg)
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1378
43196
5f9b1250b82a perf: introduce a `--iteration` to `perfdirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43161
diff changeset
  1379
    if opts[b'iteration']:
5f9b1250b82a perf: introduce a `--iteration` to `perfdirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43161
diff changeset
  1380
        setup = None
5f9b1250b82a perf: introduce a `--iteration` to `perfdirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43161
diff changeset
  1381
        dirstate = repo.dirstate
43197
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1382
43196
5f9b1250b82a perf: introduce a `--iteration` to `perfdirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43161
diff changeset
  1383
        def d():
5f9b1250b82a perf: introduce a `--iteration` to `perfdirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43161
diff changeset
  1384
            for f in dirstate:
5f9b1250b82a perf: introduce a `--iteration` to `perfdirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43161
diff changeset
  1385
                pass
43197
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1386
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1387
    elif opts[b'contains']:
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1388
        setup = None
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1389
        dirstate = repo.dirstate
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1390
        allfiles = list(dirstate)
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1391
        # also add file path that will be "missing" from the dirstate
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1392
        allfiles.extend([f[::-1] for f in allfiles])
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1393
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1394
        def d():
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1395
            for f in allfiles:
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1396
                f in dirstate
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1397
43196
5f9b1250b82a perf: introduce a `--iteration` to `perfdirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43161
diff changeset
  1398
    else:
43197
0c4efb6eb4fa perf: introduce a `--contains` flag to the `perfdirstate` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43196
diff changeset
  1399
43196
5f9b1250b82a perf: introduce a `--iteration` to `perfdirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43161
diff changeset
  1400
        def setup():
5f9b1250b82a perf: introduce a `--iteration` to `perfdirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43161
diff changeset
  1401
            repo.dirstate.invalidate()
5f9b1250b82a perf: introduce a `--iteration` to `perfdirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43161
diff changeset
  1402
5f9b1250b82a perf: introduce a `--iteration` to `perfdirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43161
diff changeset
  1403
        def d():
5f9b1250b82a perf: introduce a `--iteration` to `perfdirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43161
diff changeset
  1404
            b"a" in repo.dirstate
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1405
43122
436a6a31df38 perf: use `setup` function in `perfdirstate`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43121
diff changeset
  1406
    timer(d, setup=setup)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  1407
    fm.end()
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1408
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1409
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1410
@command(b'perf::dirstatedirs|perfdirstatedirs', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1411
def perfdirstatedirs(ui, repo, **opts):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  1412
    """benchmap a 'dirstate.hasdir' call from an empty `dirs` cache"""
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  1413
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1414
    timer, fm = gettimer(ui, opts)
43124
100e7e0cdaad perf: use `setup` function in `perfdirstatedirs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43123
diff changeset
  1415
    repo.dirstate.hasdir(b"a")
100e7e0cdaad perf: use `setup` function in `perfdirstatedirs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43123
diff changeset
  1416
100e7e0cdaad perf: use `setup` function in `perfdirstatedirs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43123
diff changeset
  1417
    def setup():
47482
eb416759af7e dirstate: Removed unused instances of `DirsMultiset`
Simon Sapin <simon.sapin@octobus.net>
parents: 47164
diff changeset
  1418
        try:
eb416759af7e dirstate: Removed unused instances of `DirsMultiset`
Simon Sapin <simon.sapin@octobus.net>
parents: 47164
diff changeset
  1419
            del repo.dirstate._map._dirs
eb416759af7e dirstate: Removed unused instances of `DirsMultiset`
Simon Sapin <simon.sapin@octobus.net>
parents: 47164
diff changeset
  1420
        except AttributeError:
eb416759af7e dirstate: Removed unused instances of `DirsMultiset`
Simon Sapin <simon.sapin@octobus.net>
parents: 47164
diff changeset
  1421
            pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1422
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1423
    def d():
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1424
        repo.dirstate.hasdir(b"a")
43124
100e7e0cdaad perf: use `setup` function in `perfdirstatedirs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43123
diff changeset
  1425
100e7e0cdaad perf: use `setup` function in `perfdirstatedirs`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43123
diff changeset
  1426
    timer(d, setup=setup)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  1427
    fm.end()
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1428
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1429
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1430
@command(b'perf::dirstatefoldmap|perfdirstatefoldmap', formatteropts)
27095
aaf4e2d77148 contrib/perf: name functions to match decorators
timeless <timeless@mozdev.org>
parents: 27072
diff changeset
  1431
def perfdirstatefoldmap(ui, repo, **opts):
43125
56494a2bfe2f perf: document `perfdirstatefoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43124
diff changeset
  1432
    """benchmap a `dirstate._map.filefoldmap.get()` request
56494a2bfe2f perf: document `perfdirstatefoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43124
diff changeset
  1433
56494a2bfe2f perf: document `perfdirstatefoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43124
diff changeset
  1434
    The dirstate filefoldmap cache is dropped between every request.
56494a2bfe2f perf: document `perfdirstatefoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43124
diff changeset
  1435
    """
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  1436
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1437
    timer, fm = gettimer(ui, opts)
22780
d8ff1f671aed perf: add a way to measure the perf of constructing the foldmap
Siddharth Agarwal <sid0@fb.com>
parents: 20846
diff changeset
  1438
    dirstate = repo.dirstate
43126
e337d8247375 perf: use `setup` function in `perfdirstatefoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43125
diff changeset
  1439
    dirstate._map.filefoldmap.get(b'a')
e337d8247375 perf: use `setup` function in `perfdirstatefoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43125
diff changeset
  1440
e337d8247375 perf: use `setup` function in `perfdirstatefoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43125
diff changeset
  1441
    def setup():
e337d8247375 perf: use `setup` function in `perfdirstatefoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43125
diff changeset
  1442
        del dirstate._map.filefoldmap
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1443
22780
d8ff1f671aed perf: add a way to measure the perf of constructing the foldmap
Siddharth Agarwal <sid0@fb.com>
parents: 20846
diff changeset
  1444
    def d():
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1445
        dirstate._map.filefoldmap.get(b'a')
43126
e337d8247375 perf: use `setup` function in `perfdirstatefoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43125
diff changeset
  1446
e337d8247375 perf: use `setup` function in `perfdirstatefoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43125
diff changeset
  1447
    timer(d, setup=setup)
24607
f5b527024fcc perf: make measuring foldmap perf work again
Siddharth Agarwal <sid0@fb.com>
parents: 24349
diff changeset
  1448
    fm.end()
f5b527024fcc perf: make measuring foldmap perf work again
Siddharth Agarwal <sid0@fb.com>
parents: 24349
diff changeset
  1449
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1450
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1451
@command(b'perf::dirfoldmap|perfdirfoldmap', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1452
def perfdirfoldmap(ui, repo, **opts):
43127
0b32206c3c86 perf: document `perfdirfoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43126
diff changeset
  1453
    """benchmap a `dirstate._map.dirfoldmap.get()` request
0b32206c3c86 perf: document `perfdirfoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43126
diff changeset
  1454
0b32206c3c86 perf: document `perfdirfoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43126
diff changeset
  1455
    The dirstate dirfoldmap cache is dropped between every request.
0b32206c3c86 perf: document `perfdirfoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43126
diff changeset
  1456
    """
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  1457
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1458
    timer, fm = gettimer(ui, opts)
24607
f5b527024fcc perf: make measuring foldmap perf work again
Siddharth Agarwal <sid0@fb.com>
parents: 24349
diff changeset
  1459
    dirstate = repo.dirstate
43128
ad801d4af7cd perf: use `setup` function in `perfdirfoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43127
diff changeset
  1460
    dirstate._map.dirfoldmap.get(b'a')
ad801d4af7cd perf: use `setup` function in `perfdirfoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43127
diff changeset
  1461
ad801d4af7cd perf: use `setup` function in `perfdirfoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43127
diff changeset
  1462
    def setup():
ad801d4af7cd perf: use `setup` function in `perfdirfoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43127
diff changeset
  1463
        del dirstate._map.dirfoldmap
47482
eb416759af7e dirstate: Removed unused instances of `DirsMultiset`
Simon Sapin <simon.sapin@octobus.net>
parents: 47164
diff changeset
  1464
        try:
eb416759af7e dirstate: Removed unused instances of `DirsMultiset`
Simon Sapin <simon.sapin@octobus.net>
parents: 47164
diff changeset
  1465
            del dirstate._map._dirs
eb416759af7e dirstate: Removed unused instances of `DirsMultiset`
Simon Sapin <simon.sapin@octobus.net>
parents: 47164
diff changeset
  1466
        except AttributeError:
eb416759af7e dirstate: Removed unused instances of `DirsMultiset`
Simon Sapin <simon.sapin@octobus.net>
parents: 47164
diff changeset
  1467
            pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1468
24607
f5b527024fcc perf: make measuring foldmap perf work again
Siddharth Agarwal <sid0@fb.com>
parents: 24349
diff changeset
  1469
    def d():
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1470
        dirstate._map.dirfoldmap.get(b'a')
43128
ad801d4af7cd perf: use `setup` function in `perfdirfoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43127
diff changeset
  1471
ad801d4af7cd perf: use `setup` function in `perfdirfoldmap`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43127
diff changeset
  1472
    timer(d, setup=setup)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  1473
    fm.end()
22780
d8ff1f671aed perf: add a way to measure the perf of constructing the foldmap
Siddharth Agarwal <sid0@fb.com>
parents: 20846
diff changeset
  1474
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1475
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1476
@command(b'perf::dirstatewrite|perfdirstatewrite', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1477
def perfdirstatewrite(ui, repo, **opts):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  1478
    """benchmap the time it take to write a dirstate on disk"""
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  1479
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1480
    timer, fm = gettimer(ui, opts)
16788
7e72c1609862 perf: add a perfdirstatewrite benchmark
Bryan O'Sullivan <bryano@fb.com>
parents: 16785
diff changeset
  1481
    ds = repo.dirstate
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1482
    b"a" in ds
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1483
43130
c88075eb28e3 perf: use `setup` function in `perfdirstatewrite`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43129
diff changeset
  1484
    def setup():
c88075eb28e3 perf: use `setup` function in `perfdirstatewrite`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43129
diff changeset
  1485
        ds._dirty = True
c88075eb28e3 perf: use `setup` function in `perfdirstatewrite`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43129
diff changeset
  1486
16788
7e72c1609862 perf: add a perfdirstatewrite benchmark
Bryan O'Sullivan <bryano@fb.com>
parents: 16785
diff changeset
  1487
    def d():
26748
5ba0a99ff27f dirstate: make dirstate.write() callers pass transaction object to it
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25850
diff changeset
  1488
        ds.write(repo.currenttransaction())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1489
50064
e859f440daa9 locking: grab the wlock before touching the dirstate in `perfdirstatewrite`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49849
diff changeset
  1490
    with repo.wlock():
e859f440daa9 locking: grab the wlock before touching the dirstate in `perfdirstatewrite`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49849
diff changeset
  1491
        timer(d, setup=setup)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  1492
    fm.end()
16788
7e72c1609862 perf: add a perfdirstatewrite benchmark
Bryan O'Sullivan <bryano@fb.com>
parents: 16785
diff changeset
  1493
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1494
42402
3a3592b40a95 perf: factor selection of revisions involved in the merge out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42401
diff changeset
  1495
def _getmergerevs(repo, opts):
3a3592b40a95 perf: factor selection of revisions involved in the merge out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42401
diff changeset
  1496
    """parse command argument to return rev involved in merge
3a3592b40a95 perf: factor selection of revisions involved in the merge out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42401
diff changeset
  1497
3a3592b40a95 perf: factor selection of revisions involved in the merge out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42401
diff changeset
  1498
    input: options dictionnary with `rev`, `from` and `bse`
3a3592b40a95 perf: factor selection of revisions involved in the merge out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42401
diff changeset
  1499
    output: (localctx, otherctx, basectx)
3a3592b40a95 perf: factor selection of revisions involved in the merge out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42401
diff changeset
  1500
    """
42411
4372d56112c9 perf: fix some missing b prefixes
Augie Fackler <augie@google.com>
parents: 42404
diff changeset
  1501
    if opts[b'from']:
4372d56112c9 perf: fix some missing b prefixes
Augie Fackler <augie@google.com>
parents: 42404
diff changeset
  1502
        fromrev = scmutil.revsingle(repo, opts[b'from'])
42400
e3ee707d42ad perf: add a --from flag to perfmergecalculate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42392
diff changeset
  1503
        wctx = repo[fromrev]
e3ee707d42ad perf: add a --from flag to perfmergecalculate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42392
diff changeset
  1504
    else:
e3ee707d42ad perf: add a --from flag to perfmergecalculate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42392
diff changeset
  1505
        wctx = repo[None]
e3ee707d42ad perf: add a --from flag to perfmergecalculate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42392
diff changeset
  1506
        # we don't want working dir files to be stat'd in the benchmark, so
e3ee707d42ad perf: add a --from flag to perfmergecalculate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42392
diff changeset
  1507
        # prime that cache
e3ee707d42ad perf: add a --from flag to perfmergecalculate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42392
diff changeset
  1508
        wctx.dirty()
42411
4372d56112c9 perf: fix some missing b prefixes
Augie Fackler <augie@google.com>
parents: 42404
diff changeset
  1509
    rctx = scmutil.revsingle(repo, opts[b'rev'], opts[b'rev'])
4372d56112c9 perf: fix some missing b prefixes
Augie Fackler <augie@google.com>
parents: 42404
diff changeset
  1510
    if opts[b'base']:
4372d56112c9 perf: fix some missing b prefixes
Augie Fackler <augie@google.com>
parents: 42404
diff changeset
  1511
        fromrev = scmutil.revsingle(repo, opts[b'base'])
42401
f0bcbbb6541c perf: allow to specify the base of the merge in perfmergecalculate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42400
diff changeset
  1512
        ancestor = repo[fromrev]
f0bcbbb6541c perf: allow to specify the base of the merge in perfmergecalculate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42400
diff changeset
  1513
    else:
f0bcbbb6541c perf: allow to specify the base of the merge in perfmergecalculate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42400
diff changeset
  1514
        ancestor = wctx.ancestor(rctx)
42402
3a3592b40a95 perf: factor selection of revisions involved in the merge out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42401
diff changeset
  1515
    return (wctx, rctx, ancestor)
3a3592b40a95 perf: factor selection of revisions involved in the merge out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42401
diff changeset
  1516
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1517
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1518
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1519
    b'perf::mergecalculate|perfmergecalculate',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1520
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1521
        (b'r', b'rev', b'.', b'rev to merge against'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1522
        (b'', b'from', b'', b'rev to merge from'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1523
        (b'', b'base', b'', b'the revision to use as base'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1524
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1525
    + formatteropts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1526
)
42402
3a3592b40a95 perf: factor selection of revisions involved in the merge out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42401
diff changeset
  1527
def perfmergecalculate(ui, repo, **opts):
3a3592b40a95 perf: factor selection of revisions involved in the merge out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42401
diff changeset
  1528
    opts = _byteskwargs(opts)
3a3592b40a95 perf: factor selection of revisions involved in the merge out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42401
diff changeset
  1529
    timer, fm = gettimer(ui, opts)
3a3592b40a95 perf: factor selection of revisions involved in the merge out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42401
diff changeset
  1530
3a3592b40a95 perf: factor selection of revisions involved in the merge out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42401
diff changeset
  1531
    wctx, rctx, ancestor = _getmergerevs(repo, opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1532
18817
c760acc6f69d perf: add a command to measure merge.calculateupdates perf
Siddharth Agarwal <sid0@fb.com>
parents: 18644
diff changeset
  1533
    def d():
c760acc6f69d perf: add a command to measure merge.calculateupdates perf
Siddharth Agarwal <sid0@fb.com>
parents: 18644
diff changeset
  1534
        # acceptremote is True because we don't want prompts in the middle of
c760acc6f69d perf: add a command to measure merge.calculateupdates perf
Siddharth Agarwal <sid0@fb.com>
parents: 18644
diff changeset
  1535
        # our benchmark
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1536
        merge.calculateupdates(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1537
            repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1538
            wctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1539
            rctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1540
            [ancestor],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1541
            branchmerge=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1542
            force=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1543
            acceptremote=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1544
            followcopies=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1545
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1546
18817
c760acc6f69d perf: add a command to measure merge.calculateupdates perf
Siddharth Agarwal <sid0@fb.com>
parents: 18644
diff changeset
  1547
    timer(d)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  1548
    fm.end()
18817
c760acc6f69d perf: add a command to measure merge.calculateupdates perf
Siddharth Agarwal <sid0@fb.com>
parents: 18644
diff changeset
  1549
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1550
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1551
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1552
    b'perf::mergecopies|perfmergecopies',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1553
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1554
        (b'r', b'rev', b'.', b'rev to merge against'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1555
        (b'', b'from', b'', b'rev to merge from'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1556
        (b'', b'base', b'', b'the revision to use as base'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1557
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1558
    + formatteropts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1559
)
42403
f5f0a9490c05 perf: add a new `perfmergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42402
diff changeset
  1560
def perfmergecopies(ui, repo, **opts):
f5f0a9490c05 perf: add a new `perfmergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42402
diff changeset
  1561
    """measure runtime of `copies.mergecopies`"""
f5f0a9490c05 perf: add a new `perfmergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42402
diff changeset
  1562
    opts = _byteskwargs(opts)
f5f0a9490c05 perf: add a new `perfmergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42402
diff changeset
  1563
    timer, fm = gettimer(ui, opts)
f5f0a9490c05 perf: add a new `perfmergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42402
diff changeset
  1564
    wctx, rctx, ancestor = _getmergerevs(repo, opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1565
42403
f5f0a9490c05 perf: add a new `perfmergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42402
diff changeset
  1566
    def d():
f5f0a9490c05 perf: add a new `perfmergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42402
diff changeset
  1567
        # acceptremote is True because we don't want prompts in the middle of
f5f0a9490c05 perf: add a new `perfmergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42402
diff changeset
  1568
        # our benchmark
f5f0a9490c05 perf: add a new `perfmergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42402
diff changeset
  1569
        copies.mergecopies(repo, wctx, rctx, ancestor)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1570
42403
f5f0a9490c05 perf: add a new `perfmergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42402
diff changeset
  1571
    timer(d)
f5f0a9490c05 perf: add a new `perfmergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42402
diff changeset
  1572
    fm.end()
f5f0a9490c05 perf: add a new `perfmergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42402
diff changeset
  1573
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1574
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1575
@command(b'perf::pathcopies|perfpathcopies', [], b"REV REV")
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1576
def perfpathcopies(ui, repo, rev1, rev2, **opts):
40773
dc3ab5e5fe64 perf: add a docstring to `perfpathcopies`
Boris Feld <boris.feld@octobus.net>
parents: 40765
diff changeset
  1577
    """benchmark the copy tracing logic"""
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  1578
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1579
    timer, fm = gettimer(ui, opts)
18877
2e9fe9e2671f perf: add a command to test copies.pathcopies perf
Siddharth Agarwal <sid0@fb.com>
parents: 18871
diff changeset
  1580
    ctx1 = scmutil.revsingle(repo, rev1, rev1)
2e9fe9e2671f perf: add a command to test copies.pathcopies perf
Siddharth Agarwal <sid0@fb.com>
parents: 18871
diff changeset
  1581
    ctx2 = scmutil.revsingle(repo, rev2, rev2)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1582
18877
2e9fe9e2671f perf: add a command to test copies.pathcopies perf
Siddharth Agarwal <sid0@fb.com>
parents: 18871
diff changeset
  1583
    def d():
2e9fe9e2671f perf: add a command to test copies.pathcopies perf
Siddharth Agarwal <sid0@fb.com>
parents: 18871
diff changeset
  1584
        copies.pathcopies(ctx1, ctx2)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1585
18877
2e9fe9e2671f perf: add a command to test copies.pathcopies perf
Siddharth Agarwal <sid0@fb.com>
parents: 18871
diff changeset
  1586
    timer(d)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  1587
    fm.end()
18877
2e9fe9e2671f perf: add a command to test copies.pathcopies perf
Siddharth Agarwal <sid0@fb.com>
parents: 18871
diff changeset
  1588
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1589
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1590
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1591
    b'perf::phases|perfphases',
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  1592
    [
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  1593
        (b'', b'full', False, b'include file reading time too'),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  1594
    ],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1595
    b"",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1596
)
32501
ad37c569ec81 perfphases: add 'perfphases' command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32428
diff changeset
  1597
def perfphases(ui, repo, **opts):
ad37c569ec81 perfphases: add 'perfphases' command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32428
diff changeset
  1598
    """benchmark phasesets computation"""
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  1599
    opts = _byteskwargs(opts)
32501
ad37c569ec81 perfphases: add 'perfphases' command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32428
diff changeset
  1600
    timer, fm = gettimer(ui, opts)
32752
e36569bd9e28 perfphases: add a flag to also include file access time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32751
diff changeset
  1601
    _phases = repo._phasecache
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1602
    full = opts.get(b'full')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1603
32501
ad37c569ec81 perfphases: add 'perfphases' command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32428
diff changeset
  1604
    def d():
32752
e36569bd9e28 perfphases: add a flag to also include file access time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32751
diff changeset
  1605
        phases = _phases
e36569bd9e28 perfphases: add a flag to also include file access time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32751
diff changeset
  1606
        if full:
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1607
            clearfilecache(repo, b'_phasecache')
32752
e36569bd9e28 perfphases: add a flag to also include file access time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32751
diff changeset
  1608
            phases = repo._phasecache
32501
ad37c569ec81 perfphases: add 'perfphases' command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32428
diff changeset
  1609
        phases.invalidate()
ad37c569ec81 perfphases: add 'perfphases' command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32428
diff changeset
  1610
        phases.loadphaserevs(repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1611
32501
ad37c569ec81 perfphases: add 'perfphases' command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32428
diff changeset
  1612
    timer(d)
ad37c569ec81 perfphases: add 'perfphases' command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32428
diff changeset
  1613
    fm.end()
ad37c569ec81 perfphases: add 'perfphases' command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32428
diff changeset
  1614
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1615
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1616
@command(b'perf::phasesremote|perfphasesremote', [], b"[DEST]")
38771
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1617
def perfphasesremote(ui, repo, dest=None, **opts):
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1618
    """benchmark time needed to analyse phases of the remote server"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1619
    from mercurial.node import bin
38771
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1620
    from mercurial import (
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1621
        exchange,
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1622
        hg,
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1623
        phases,
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1624
    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1625
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  1626
    opts = _byteskwargs(opts)
38771
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1627
    timer, fm = gettimer(ui, opts)
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1628
46733
66fb04552122 ui: pass a `ui` object to `paths.getpath`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46460
diff changeset
  1629
    path = ui.getpath(dest, default=(b'default-push', b'default'))
38771
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1630
    if not path:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1631
        raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1632
            b'default repository not configured!',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1633
            hint=b"see 'hg help config.paths'",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1634
        )
49817
ec8140c44b14 path: update logic in `perf` to use the push variant when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49554
diff changeset
  1635
    if util.safehasattr(path, 'main_path'):
ec8140c44b14 path: update logic in `perf` to use the push variant when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49554
diff changeset
  1636
        path = path.get_push_variant()
ec8140c44b14 path: update logic in `perf` to use the push variant when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49554
diff changeset
  1637
        dest = path.loc
ec8140c44b14 path: update logic in `perf` to use the push variant when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49554
diff changeset
  1638
    else:
ec8140c44b14 path: update logic in `perf` to use the push variant when available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49554
diff changeset
  1639
        dest = path.pushloc or path.loc
43080
86e4daa2d54c cleanup: mark some ui.(status|note|warn|write) calls as not needing i18n
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1640
    ui.statusnoi18n(b'analysing phase of %s\n' % util.hidepassword(dest))
38771
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1641
    other = hg.peer(repo, opts, dest)
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1642
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1643
    # easier to perform discovery through the operation
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1644
    op = exchange.pushoperation(repo, other)
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1645
    exchange._pushdiscoverychangeset(op)
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1646
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1647
    remotesubset = op.fallbackheads
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1648
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1649
    with other.commandexecutor() as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1650
        remotephases = e.callcommand(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1651
            b'listkeys', {b'namespace': b'phases'}
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1652
        ).result()
38771
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1653
    del other
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1654
    publishing = remotephases.get(b'publishing', False)
38771
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1655
    if publishing:
43080
86e4daa2d54c cleanup: mark some ui.(status|note|warn|write) calls as not needing i18n
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1656
        ui.statusnoi18n(b'publishing: yes\n')
38771
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1657
    else:
43080
86e4daa2d54c cleanup: mark some ui.(status|note|warn|write) calls as not needing i18n
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1658
        ui.statusnoi18n(b'publishing: no\n')
38771
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1659
43599
3350d7aefe67 perf: make `perfphasesremote` use the new `index.has_node` api
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43575
diff changeset
  1660
    has_node = getattr(repo.changelog.index, 'has_node', None)
3350d7aefe67 perf: make `perfphasesremote` use the new `index.has_node` api
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43575
diff changeset
  1661
    if has_node is None:
3350d7aefe67 perf: make `perfphasesremote` use the new `index.has_node` api
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43575
diff changeset
  1662
        has_node = repo.changelog.nodemap.__contains__
38771
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1663
    nonpublishroots = 0
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1664
    for nhex, phase in remotephases.iteritems():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1665
        if nhex == b'publishing':  # ignore data related to publish option
38771
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1666
            continue
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1667
        node = bin(nhex)
43599
3350d7aefe67 perf: make `perfphasesremote` use the new `index.has_node` api
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43575
diff changeset
  1668
        if has_node(node) and int(phase):
38771
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1669
            nonpublishroots += 1
43080
86e4daa2d54c cleanup: mark some ui.(status|note|warn|write) calls as not needing i18n
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1670
    ui.statusnoi18n(b'number of roots: %d\n' % len(remotephases))
86e4daa2d54c cleanup: mark some ui.(status|note|warn|write) calls as not needing i18n
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1671
    ui.statusnoi18n(b'number of known non public roots: %d\n' % nonpublishroots)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1672
38771
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1673
    def d():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1674
        phases.remotephasessummary(repo, remotesubset, remotephases)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1675
38771
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1676
    timer(d)
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1677
    fm.end()
1732db2f8210 perf: add a perfphasesremote command
Boris Feld <boris.feld@octobus.net>
parents: 38695
diff changeset
  1678
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1679
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1680
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1681
    b'perf::manifest|perfmanifest',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1682
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1683
        (b'm', b'manifest-rev', False, b'Look up a manifest node revision'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1684
        (b'', b'clear-disk', False, b'clear on-disk caches too'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1685
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1686
    + formatteropts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1687
    b'REV|NODE',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1688
)
38820
ddb15a83ae0b debug: allow specifying a manifest node rather than a revision
Martijn Pieters <mj@zopatista.com>
parents: 38819
diff changeset
  1689
def perfmanifest(ui, repo, rev, manifest_rev=False, clear_disk=False, **opts):
38693
9b6a708f2263 perf: document the perfmanifest command
Boris Feld <boris.feld@octobus.net>
parents: 38285
diff changeset
  1690
    """benchmark the time to read a manifest from disk and return a usable
9b6a708f2263 perf: document the perfmanifest command
Boris Feld <boris.feld@octobus.net>
parents: 38285
diff changeset
  1691
    dict-like object
9b6a708f2263 perf: document the perfmanifest command
Boris Feld <boris.feld@octobus.net>
parents: 38285
diff changeset
  1692
9b6a708f2263 perf: document the perfmanifest command
Boris Feld <boris.feld@octobus.net>
parents: 38285
diff changeset
  1693
    Manifest caches are cleared before retrieval."""
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  1694
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1695
    timer, fm = gettimer(ui, opts)
38820
ddb15a83ae0b debug: allow specifying a manifest node rather than a revision
Martijn Pieters <mj@zopatista.com>
parents: 38819
diff changeset
  1696
    if not manifest_rev:
ddb15a83ae0b debug: allow specifying a manifest node rather than a revision
Martijn Pieters <mj@zopatista.com>
parents: 38819
diff changeset
  1697
        ctx = scmutil.revsingle(repo, rev, rev)
ddb15a83ae0b debug: allow specifying a manifest node rather than a revision
Martijn Pieters <mj@zopatista.com>
parents: 38819
diff changeset
  1698
        t = ctx.manifestnode()
ddb15a83ae0b debug: allow specifying a manifest node rather than a revision
Martijn Pieters <mj@zopatista.com>
parents: 38819
diff changeset
  1699
    else:
39345
c03c5f528e9b perf: use storage API for resolving manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39226
diff changeset
  1700
        from mercurial.node import bin
c03c5f528e9b perf: use storage API for resolving manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39226
diff changeset
  1701
c03c5f528e9b perf: use storage API for resolving manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39226
diff changeset
  1702
        if len(rev) == 40:
c03c5f528e9b perf: use storage API for resolving manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39226
diff changeset
  1703
            t = bin(rev)
c03c5f528e9b perf: use storage API for resolving manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39226
diff changeset
  1704
        else:
c03c5f528e9b perf: use storage API for resolving manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39226
diff changeset
  1705
            try:
c03c5f528e9b perf: use storage API for resolving manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39226
diff changeset
  1706
                rev = int(rev)
c03c5f528e9b perf: use storage API for resolving manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39226
diff changeset
  1707
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  1708
                if util.safehasattr(repo.manifestlog, b'getstorage'):
39345
c03c5f528e9b perf: use storage API for resolving manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39226
diff changeset
  1709
                    t = repo.manifestlog.getstorage(b'').node(rev)
c03c5f528e9b perf: use storage API for resolving manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39226
diff changeset
  1710
                else:
c03c5f528e9b perf: use storage API for resolving manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39226
diff changeset
  1711
                    t = repo.manifestlog._revlog.lookup(rev)
c03c5f528e9b perf: use storage API for resolving manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39226
diff changeset
  1712
            except ValueError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1713
                raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43080
diff changeset
  1714
                    b'manifest revision must be integer or full node'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1715
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1716
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1717
    def d():
38821
0a57945aaf7f manifest: persist the manifestfulltext cache
Martijn Pieters <mj@zopatista.com>
parents: 38820
diff changeset
  1718
        repo.manifestlog.clearcaches(clear_persisted_data=clear_disk)
30379
d79c141fdf41 manifest: remove usages of manifest.read
Durham Goode <durham@fb.com>
parents: 30347
diff changeset
  1719
        repo.manifestlog[t].read()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1720
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1721
    timer(d)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  1722
    fm.end()
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1723
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1724
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1725
@command(b'perf::changeset|perfchangeset', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1726
def perfchangeset(ui, repo, rev, **opts):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  1727
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1728
    timer, fm = gettimer(ui, opts)
37355
5bcd5859b505 perf: make perfmanifest and perfnodelookup work with revsets
Martin von Zweigbergk <martinvonz@google.com>
parents: 37271
diff changeset
  1729
    n = scmutil.revsingle(repo, rev).node()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1730
16262
bf7a6c3b2a4a perf: add perfchangeset to time changeset parsing
Matt Mackall <mpm@selenic.com>
parents: 16260
diff changeset
  1731
    def d():
19378
9de689d20230 cleanup: drop unused variables and an unused import
Simon Heimberg <simohe@besonet.ch>
parents: 19322
diff changeset
  1732
        repo.changelog.read(n)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1733
        # repo.changelog._cache = None
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1734
16262
bf7a6c3b2a4a perf: add perfchangeset to time changeset parsing
Matt Mackall <mpm@selenic.com>
parents: 16260
diff changeset
  1735
    timer(d)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  1736
    fm.end()
16262
bf7a6c3b2a4a perf: add perfchangeset to time changeset parsing
Matt Mackall <mpm@selenic.com>
parents: 16260
diff changeset
  1737
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1738
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1739
@command(b'perf::ignore|perfignore', formatteropts)
40784
45a0047c0ebc perf: add a perfignore command
Boris Feld <boris.feld@octobus.net>
parents: 40781
diff changeset
  1740
def perfignore(ui, repo, **opts):
45a0047c0ebc perf: add a perfignore command
Boris Feld <boris.feld@octobus.net>
parents: 40781
diff changeset
  1741
    """benchmark operation related to computing ignore"""
45a0047c0ebc perf: add a perfignore command
Boris Feld <boris.feld@octobus.net>
parents: 40781
diff changeset
  1742
    opts = _byteskwargs(opts)
45a0047c0ebc perf: add a perfignore command
Boris Feld <boris.feld@octobus.net>
parents: 40781
diff changeset
  1743
    timer, fm = gettimer(ui, opts)
45a0047c0ebc perf: add a perfignore command
Boris Feld <boris.feld@octobus.net>
parents: 40781
diff changeset
  1744
    dirstate = repo.dirstate
45a0047c0ebc perf: add a perfignore command
Boris Feld <boris.feld@octobus.net>
parents: 40781
diff changeset
  1745
45a0047c0ebc perf: add a perfignore command
Boris Feld <boris.feld@octobus.net>
parents: 40781
diff changeset
  1746
    def setupone():
45a0047c0ebc perf: add a perfignore command
Boris Feld <boris.feld@octobus.net>
parents: 40781
diff changeset
  1747
        dirstate.invalidate()
45a0047c0ebc perf: add a perfignore command
Boris Feld <boris.feld@octobus.net>
parents: 40781
diff changeset
  1748
        clearfilecache(dirstate, b'_ignore')
45a0047c0ebc perf: add a perfignore command
Boris Feld <boris.feld@octobus.net>
parents: 40781
diff changeset
  1749
45a0047c0ebc perf: add a perfignore command
Boris Feld <boris.feld@octobus.net>
parents: 40781
diff changeset
  1750
    def runone():
45a0047c0ebc perf: add a perfignore command
Boris Feld <boris.feld@octobus.net>
parents: 40781
diff changeset
  1751
        dirstate._ignore
45a0047c0ebc perf: add a perfignore command
Boris Feld <boris.feld@octobus.net>
parents: 40781
diff changeset
  1752
45a0047c0ebc perf: add a perfignore command
Boris Feld <boris.feld@octobus.net>
parents: 40781
diff changeset
  1753
    timer(runone, setup=setupone, title=b"load")
45a0047c0ebc perf: add a perfignore command
Boris Feld <boris.feld@octobus.net>
parents: 40781
diff changeset
  1754
    fm.end()
45a0047c0ebc perf: add a perfignore command
Boris Feld <boris.feld@octobus.net>
parents: 40781
diff changeset
  1755
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1756
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1757
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1758
    b'perf::index|perfindex',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1759
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1760
        (b'', b'rev', [], b'revision to be looked up (default tip)'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1761
        (b'', b'no-lookup', None, b'do not revision lookup post creation'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1762
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1763
    + formatteropts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1764
)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1765
def perfindex(ui, repo, **opts):
41459
d65ba1ff4559 perf: add some documentation to perfindex
Boris Feld <boris.feld@octobus.net>
parents: 41458
diff changeset
  1766
    """benchmark index creation time followed by a lookup
d65ba1ff4559 perf: add some documentation to perfindex
Boris Feld <boris.feld@octobus.net>
parents: 41458
diff changeset
  1767
d65ba1ff4559 perf: add some documentation to perfindex
Boris Feld <boris.feld@octobus.net>
parents: 41458
diff changeset
  1768
    The default is to look `tip` up. Depending on the index implementation,
d65ba1ff4559 perf: add some documentation to perfindex
Boris Feld <boris.feld@octobus.net>
parents: 41458
diff changeset
  1769
    the revision looked up can matters. For example, an implementation
d65ba1ff4559 perf: add some documentation to perfindex
Boris Feld <boris.feld@octobus.net>
parents: 41458
diff changeset
  1770
    scanning the index will have a faster lookup time for `--rev tip` than for
41461
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1771
    `--rev 0`. The number of looked up revisions and their order can also
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1772
    matters.
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1773
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1774
    Example of useful set to test:
44307
216fc4633800 perf: fix list formatting in perfindex documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43981
diff changeset
  1775
41461
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1776
    * tip
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1777
    * 0
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1778
    * -10:
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1779
    * :10
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1780
    * -10: + :10
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1781
    * :10: + -10:
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1782
    * -10000:
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1783
    * -10000: + 0
41459
d65ba1ff4559 perf: add some documentation to perfindex
Boris Feld <boris.feld@octobus.net>
parents: 41458
diff changeset
  1784
41483
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1785
    It is not currently possible to check for lookup of a missing node. For
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1786
    deeper lookup benchmarking, checkout the `perfnodemap` command."""
13255
2696730ca233 perf: make perfindex results useful on hg with lazyparser
Matt Mackall <mpm@selenic.com>
parents: 13254
diff changeset
  1787
    import mercurial.revlog
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1788
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  1789
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1790
    timer, fm = gettimer(ui, opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1791
    mercurial.revlog._prereadsize = 2 ** 24  # disable lazy parser in old hg
41460
e9891c734bf8 perf: add a no-lookup variant to perfindex
Boris Feld <boris.feld@octobus.net>
parents: 41459
diff changeset
  1792
    if opts[b'no_lookup']:
41461
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1793
        if opts['rev']:
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1794
            raise error.Abort('--no-lookup and --rev are mutually exclusive')
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1795
        nodes = []
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1796
    elif not opts[b'rev']:
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1797
        nodes = [repo[b"tip"].node()]
40818
a0f2641ddd61 perf: add a --rev attribute to perfindex
Boris Feld <boris.feld@octobus.net>
parents: 40817
diff changeset
  1798
    else:
41461
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1799
        revs = scmutil.revrange(repo, opts[b'rev'])
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1800
        cl = repo.changelog
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1801
        nodes = [cl.node(r) for r in revs]
40817
e207f0d6c243 perf: update perfindex to be more realistic
Boris Feld <boris.feld@octobus.net>
parents: 40806
diff changeset
  1802
e207f0d6c243 perf: update perfindex to be more realistic
Boris Feld <boris.feld@octobus.net>
parents: 40806
diff changeset
  1803
    unfi = repo.unfiltered()
e207f0d6c243 perf: update perfindex to be more realistic
Boris Feld <boris.feld@octobus.net>
parents: 40806
diff changeset
  1804
    # find the filecache func directly
e207f0d6c243 perf: update perfindex to be more realistic
Boris Feld <boris.feld@octobus.net>
parents: 40806
diff changeset
  1805
    # This avoid polluting the benchmark with the filecache logic
e207f0d6c243 perf: update perfindex to be more realistic
Boris Feld <boris.feld@octobus.net>
parents: 40806
diff changeset
  1806
    makecl = unfi.__class__.changelog.func
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1807
40817
e207f0d6c243 perf: update perfindex to be more realistic
Boris Feld <boris.feld@octobus.net>
parents: 40806
diff changeset
  1808
    def setup():
e207f0d6c243 perf: update perfindex to be more realistic
Boris Feld <boris.feld@octobus.net>
parents: 40806
diff changeset
  1809
        # probably not necessary, but for good measure
e207f0d6c243 perf: update perfindex to be more realistic
Boris Feld <boris.feld@octobus.net>
parents: 40806
diff changeset
  1810
        clearchangelog(unfi)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1811
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1812
    def d():
40817
e207f0d6c243 perf: update perfindex to be more realistic
Boris Feld <boris.feld@octobus.net>
parents: 40806
diff changeset
  1813
        cl = makecl(unfi)
41461
7eb7637e34bf perf: support looking up multiple revisions
Boris Feld <boris.feld@octobus.net>
parents: 41460
diff changeset
  1814
        for n in nodes:
41460
e9891c734bf8 perf: add a no-lookup variant to perfindex
Boris Feld <boris.feld@octobus.net>
parents: 41459
diff changeset
  1815
            cl.rev(n)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1816
40817
e207f0d6c243 perf: update perfindex to be more realistic
Boris Feld <boris.feld@octobus.net>
parents: 40806
diff changeset
  1817
    timer(d, setup=setup)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  1818
    fm.end()
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1819
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1820
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1821
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1822
    b'perf::nodemap|perfnodemap',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1823
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1824
        (b'', b'rev', [], b'revision to be looked up (default tip)'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1825
        (b'', b'clear-caches', True, b'clear revlog cache between calls'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1826
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1827
    + formatteropts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1828
)
41483
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1829
def perfnodemap(ui, repo, **opts):
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1830
    """benchmark the time necessary to look up revision from a cold nodemap
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1831
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1832
    Depending on the implementation, the amount and order of revision we look
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1833
    up can varies. Example of useful set to test:
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1834
    * tip
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1835
    * 0
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1836
    * -10:
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1837
    * :10
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1838
    * -10: + :10
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1839
    * :10: + -10:
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1840
    * -10000:
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1841
    * -10000: + 0
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1842
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1843
    The command currently focus on valid binary lookup. Benchmarking for
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1844
    hexlookup, prefix lookup and missing lookup would also be valuable.
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1845
    """
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1846
    import mercurial.revlog
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1847
41483
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1848
    opts = _byteskwargs(opts)
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1849
    timer, fm = gettimer(ui, opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1850
    mercurial.revlog._prereadsize = 2 ** 24  # disable lazy parser in old hg
41483
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1851
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1852
    unfi = repo.unfiltered()
46196
96b73671753a contrib: py3 compat for perfnodemap
Joerg Sonnenberger <joerg@bec.de>
parents: 45957
diff changeset
  1853
    clearcaches = opts[b'clear_caches']
41483
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1854
    # find the filecache func directly
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1855
    # This avoid polluting the benchmark with the filecache logic
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1856
    makecl = unfi.__class__.changelog.func
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1857
    if not opts[b'rev']:
46196
96b73671753a contrib: py3 compat for perfnodemap
Joerg Sonnenberger <joerg@bec.de>
parents: 45957
diff changeset
  1858
        raise error.Abort(b'use --rev to specify revisions to look up')
41483
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1859
    revs = scmutil.revrange(repo, opts[b'rev'])
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1860
    cl = repo.changelog
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1861
    nodes = [cl.node(r) for r in revs]
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1862
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1863
    # use a list to pass reference to a nodemap from one closure to the next
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1864
    nodeget = [None]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1865
41483
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1866
    def setnodeget():
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1867
        # probably not necessary, but for good measure
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1868
        clearchangelog(unfi)
43619
22cd0064370d perf: make `perfnodemap` use the new `index.get_rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43599
diff changeset
  1869
        cl = makecl(unfi)
22cd0064370d perf: make `perfnodemap` use the new `index.get_rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43599
diff changeset
  1870
        if util.safehasattr(cl.index, 'get_rev'):
22cd0064370d perf: make `perfnodemap` use the new `index.get_rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43599
diff changeset
  1871
            nodeget[0] = cl.index.get_rev
22cd0064370d perf: make `perfnodemap` use the new `index.get_rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43599
diff changeset
  1872
        else:
22cd0064370d perf: make `perfnodemap` use the new `index.get_rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43599
diff changeset
  1873
            nodeget[0] = cl.nodemap.get
41483
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1874
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1875
    def d():
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1876
        get = nodeget[0]
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1877
        for n in nodes:
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1878
            get(n)
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1879
41484
d1a273074f62 perf: add a --[no-]clear-caches option to `perfnodemap`
Boris Feld <boris.feld@octobus.net>
parents: 41483
diff changeset
  1880
    setup = None
d1a273074f62 perf: add a --[no-]clear-caches option to `perfnodemap`
Boris Feld <boris.feld@octobus.net>
parents: 41483
diff changeset
  1881
    if clearcaches:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1882
41484
d1a273074f62 perf: add a --[no-]clear-caches option to `perfnodemap`
Boris Feld <boris.feld@octobus.net>
parents: 41483
diff changeset
  1883
        def setup():
d1a273074f62 perf: add a --[no-]clear-caches option to `perfnodemap`
Boris Feld <boris.feld@octobus.net>
parents: 41483
diff changeset
  1884
            setnodeget()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1885
41484
d1a273074f62 perf: add a --[no-]clear-caches option to `perfnodemap`
Boris Feld <boris.feld@octobus.net>
parents: 41483
diff changeset
  1886
    else:
d1a273074f62 perf: add a --[no-]clear-caches option to `perfnodemap`
Boris Feld <boris.feld@octobus.net>
parents: 41483
diff changeset
  1887
        setnodeget()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1888
        d()  # prewarm the data structure
41483
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1889
    timer(d, setup=setup)
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1890
    fm.end()
c9ff93889550 perf: add a perfnodemap command
Boris Feld <boris.feld@octobus.net>
parents: 41461
diff changeset
  1891
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1892
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  1893
@command(b'perf::startup|perfstartup', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1894
def perfstartup(ui, repo, **opts):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  1895
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  1896
    timer, fm = gettimer(ui, opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1897
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1898
    def d():
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43551
diff changeset
  1899
        if os.name != 'nt':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1900
            os.system(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1901
                b"HGRCPATH= %s version -q > /dev/null" % fsencode(sys.argv[0])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1902
            )
27382
de7bcbc68042 perf: adjust perfstartup() for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 27345
diff changeset
  1903
        else:
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43551
diff changeset
  1904
            os.environ['HGRCPATH'] = r' '
43551
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43543
diff changeset
  1905
            os.system("%s version -q > NUL" % sys.argv[0])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1906
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1907
    timer(d)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  1908
    fm.end()
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  1909
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  1910
50682
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1911
def _find_stream_generator(version):
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1912
    """find the proper generator function for this stream version"""
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1913
    import mercurial.streamclone
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1914
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1915
    available = {}
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1916
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1917
    # try to fetch a v1 generator
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1918
    generatev1 = getattr(mercurial.streamclone, "generatev1", None)
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1919
    if generatev1 is not None:
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1920
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1921
        def generate(repo):
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1922
            entries, bytes, data = generatev2(repo, None, None, True)
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1923
            return data
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1924
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1925
        available[b'v1'] = generatev1
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1926
    # try to fetch a v2 generator
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1927
    generatev2 = getattr(mercurial.streamclone, "generatev2", None)
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1928
    if generatev2 is not None:
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1929
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1930
        def generate(repo):
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1931
            entries, bytes, data = generatev2(repo, None, None, True)
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1932
            return data
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1933
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1934
        available[b'v2'] = generate
50683
3ce370a00225 perf: add support for stream-v3 during benchmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50682
diff changeset
  1935
    # try to fetch a v3 generator
3ce370a00225 perf: add support for stream-v3 during benchmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50682
diff changeset
  1936
    generatev3 = getattr(mercurial.streamclone, "generatev3", None)
3ce370a00225 perf: add support for stream-v3 during benchmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50682
diff changeset
  1937
    if generatev3 is not None:
3ce370a00225 perf: add support for stream-v3 during benchmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50682
diff changeset
  1938
3ce370a00225 perf: add support for stream-v3 during benchmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50682
diff changeset
  1939
        def generate(repo):
3ce370a00225 perf: add support for stream-v3 during benchmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50682
diff changeset
  1940
            entries, bytes, data = generatev3(repo, None, None, True)
3ce370a00225 perf: add support for stream-v3 during benchmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50682
diff changeset
  1941
            return data
3ce370a00225 perf: add support for stream-v3 during benchmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50682
diff changeset
  1942
3ce370a00225 perf: add support for stream-v3 during benchmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50682
diff changeset
  1943
        available[b'v3-exp'] = generate
3ce370a00225 perf: add support for stream-v3 during benchmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50682
diff changeset
  1944
50682
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1945
    # resolve the request
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1946
    if version == b"latest":
50683
3ce370a00225 perf: add support for stream-v3 during benchmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50682
diff changeset
  1947
        # latest is the highest non experimental version
3ce370a00225 perf: add support for stream-v3 during benchmark
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50682
diff changeset
  1948
        latest_key = max(v for v in available if b'-exp' not in v)
50682
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1949
        return available[latest_key]
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1950
    elif version in available:
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1951
        return available[version]
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1952
    else:
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1953
        msg = b"unkown or unavailable version: %s"
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1954
        msg %= version
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1955
        hint = b"available versions: %s"
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1956
        hint %= b', '.join(sorted(available))
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1957
        raise error.Abort(msg, hint=hint)
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1958
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1959
50492
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1960
@command(
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1961
    b'perf::stream-locked-section',
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1962
    [
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1963
        (
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1964
            b'',
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1965
            b'stream-version',
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1966
            b'latest',
50705
0bba730005df stream-clone: fix the help for an argument of perf::stream-locked-section
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50686
diff changeset
  1967
            b'stream version to use ("v1", "v2", "v3" or "latest", (the default))',
50492
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1968
        ),
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1969
    ]
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1970
    + formatteropts,
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1971
)
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1972
def perf_stream_clone_scan(ui, repo, stream_version, **opts):
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1973
    """benchmark the initial, repo-locked, section of a stream-clone"""
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1974
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1975
    opts = _byteskwargs(opts)
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1976
    timer, fm = gettimer(ui, opts)
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1977
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1978
    # deletion of the generator may trigger some cleanup that we do not want to
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1979
    # measure
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1980
    result_holder = [None]
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1981
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1982
    def setupone():
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1983
        result_holder[0] = None
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1984
50682
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1985
    generate = _find_stream_generator(stream_version)
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1986
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1987
    def runone():
50492
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1988
        # the lock is held for the duration the initialisation
50682
b10c786b0145 perf: add a function to find a stream version generator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50492
diff changeset
  1989
        result_holder[0] = generate(repo)
50492
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1990
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1991
    timer(runone, setup=setupone, title=b"load")
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1992
    fm.end()
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1993
714b63a707b7 perf: introduce a `perf::stream-locked-section` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50192
diff changeset
  1994
50685
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  1995
@command(
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  1996
    b'perf::stream-generate',
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  1997
    [
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  1998
        (
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  1999
            b'',
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2000
            b'stream-version',
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2001
            b'latest',
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2002
            b'stream version to us ("v1", "v2" or "latest", (the default))',
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2003
        ),
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2004
    ]
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2005
    + formatteropts,
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2006
)
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2007
def perf_stream_clone_generate(ui, repo, stream_version, **opts):
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2008
    """benchmark the full generation of a stream clone"""
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2009
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2010
    opts = _byteskwargs(opts)
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2011
    timer, fm = gettimer(ui, opts)
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2012
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2013
    # deletion of the generator may trigger some cleanup that we do not want to
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2014
    # measure
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2015
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2016
    generate = _find_stream_generator(stream_version)
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2017
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2018
    def runone():
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2019
        # the lock is held for the duration the initialisation
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2020
        for chunk in generate(repo):
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2021
            pass
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2022
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2023
    timer(runone, title=b"generate")
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2024
    fm.end()
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2025
b8de54ac5a21 perf: add a perf::stream-generate command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50684
diff changeset
  2026
50686
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2027
@command(
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2028
    b'perf::stream-consume',
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2029
    formatteropts,
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2030
)
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2031
def perf_stream_clone_consume(ui, repo, filename, **opts):
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2032
    """benchmark the full application of a stream clone
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2033
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2034
    This include the creation of the repository
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2035
    """
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2036
    # try except to appease check code
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2037
    msg = b"mercurial too old, missing necessary module: %s"
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2038
    try:
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2039
        from mercurial import bundle2
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2040
    except ImportError as exc:
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2041
        msg %= _bytestr(exc)
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2042
        raise error.Abort(msg)
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2043
    try:
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2044
        from mercurial import exchange
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2045
    except ImportError as exc:
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2046
        msg %= _bytestr(exc)
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2047
        raise error.Abort(msg)
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2048
    try:
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2049
        from mercurial import hg
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2050
    except ImportError as exc:
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2051
        msg %= _bytestr(exc)
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2052
        raise error.Abort(msg)
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2053
    try:
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2054
        from mercurial import localrepo
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2055
    except ImportError as exc:
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2056
        msg %= _bytestr(exc)
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2057
        raise error.Abort(msg)
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2058
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2059
    opts = _byteskwargs(opts)
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2060
    timer, fm = gettimer(ui, opts)
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2061
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2062
    # deletion of the generator may trigger some cleanup that we do not want to
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2063
    # measure
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2064
    if not (os.path.isfile(filename) and os.access(filename, os.R_OK)):
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2065
        raise error.Abort("not a readable file: %s" % filename)
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2066
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2067
    run_variables = [None, None]
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2068
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2069
    @contextlib.contextmanager
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2070
    def context():
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2071
        with open(filename, mode='rb') as bundle:
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2072
            with tempfile.TemporaryDirectory() as tmp_dir:
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2073
                tmp_dir = fsencode(tmp_dir)
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2074
                run_variables[0] = bundle
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2075
                run_variables[1] = tmp_dir
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2076
                yield
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2077
                run_variables[0] = None
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2078
                run_variables[1] = None
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2079
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2080
    def runone():
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2081
        bundle = run_variables[0]
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2082
        tmp_dir = run_variables[1]
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2083
        # only pass ui when no srcrepo
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2084
        localrepo.createrepository(
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2085
            repo.ui, tmp_dir, requirements=repo.requirements
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2086
        )
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2087
        target = hg.repository(repo.ui, tmp_dir)
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2088
        gen = exchange.readbundle(target.ui, bundle, bundle.name)
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2089
        # stream v1
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2090
        if util.safehasattr(gen, 'apply'):
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2091
            gen.apply(target)
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2092
        else:
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2093
            with target.transaction(b"perf::stream-consume") as tr:
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2094
                bundle2.applybundle(
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2095
                    target,
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2096
                    gen,
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2097
                    tr,
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2098
                    source=b'unbundle',
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2099
                    url=filename,
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2100
                )
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2101
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2102
    timer(runone, context=context, title=b"consume")
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2103
    fm.end()
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2104
459681233b1f perf: add a perf::stream-consume
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50685
diff changeset
  2105
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  2106
@command(b'perf::parents|perfparents', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2107
def perfparents(ui, repo, **opts):
42016
b900b392c1cc perf: document perfparents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42015
diff changeset
  2108
    """benchmark the time necessary to fetch one changeset's parents.
b900b392c1cc perf: document perfparents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42015
diff changeset
  2109
42021
4c700c847aa2 perf: copyedit a few documentation strings
Augie Fackler <augie@google.com>
parents: 42019
diff changeset
  2110
    The fetch is done using the `node identifier`, traversing all object layers
4c700c847aa2 perf: copyedit a few documentation strings
Augie Fackler <augie@google.com>
parents: 42019
diff changeset
  2111
    from the repository object. The first N revisions will be used for this
42016
b900b392c1cc perf: document perfparents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42015
diff changeset
  2112
    benchmark. N is controlled by the ``perf.parentscount`` config option
b900b392c1cc perf: document perfparents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42015
diff changeset
  2113
    (default: 1000).
b900b392c1cc perf: document perfparents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42015
diff changeset
  2114
    """
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  2115
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2116
    timer, fm = gettimer(ui, opts)
27305
5831cfbf0e33 perf: perfparents honor config perf.parentscount
timeless <timeless@mozdev.org>
parents: 27304
diff changeset
  2117
    # control the number of commits perfparents iterates over
5831cfbf0e33 perf: perfparents honor config perf.parentscount
timeless <timeless@mozdev.org>
parents: 27304
diff changeset
  2118
    # experimental config: perf.parentscount
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  2119
    count = getint(ui, b"perf", b"parentscount", 1000)
27305
5831cfbf0e33 perf: perfparents honor config perf.parentscount
timeless <timeless@mozdev.org>
parents: 27304
diff changeset
  2120
    if len(repo.changelog) < count:
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  2121
        raise error.Abort(b"repo needs %d commits for this test" % count)
27100
8d5dba93aa4f contrib/perf: perfparents handle filtered repos
timeless <timeless@mozdev.org>
parents: 27099
diff changeset
  2122
    repo = repo.unfiltered()
39827
86dbeb7c9a11 py3: switch contrib/perf from xrange to pycompat.xrange
Matt Harbison <matt_harbison@yahoo.com>
parents: 39826
diff changeset
  2123
    nl = [repo.changelog.node(i) for i in _xrange(count)]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2124
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  2125
    def d():
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  2126
        for n in nl:
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  2127
            repo.changelog.parents(n)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2128
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  2129
    timer(d)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  2130
    fm.end()
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  2131
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2132
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  2133
@command(b'perf::ctxfiles|perfctxfiles', formatteropts)
27095
aaf4e2d77148 contrib/perf: name functions to match decorators
timeless <timeless@mozdev.org>
parents: 27072
diff changeset
  2134
def perfctxfiles(ui, repo, x, **opts):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  2135
    opts = _byteskwargs(opts)
24349
389693a245fa perf: add methods for timing changeset file list reading
Matt Mackall <mpm@selenic.com>
parents: 23878
diff changeset
  2136
    x = int(x)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2137
    timer, fm = gettimer(ui, opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2138
24349
389693a245fa perf: add methods for timing changeset file list reading
Matt Mackall <mpm@selenic.com>
parents: 23878
diff changeset
  2139
    def d():
389693a245fa perf: add methods for timing changeset file list reading
Matt Mackall <mpm@selenic.com>
parents: 23878
diff changeset
  2140
        len(repo[x].files())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2141
24349
389693a245fa perf: add methods for timing changeset file list reading
Matt Mackall <mpm@selenic.com>
parents: 23878
diff changeset
  2142
    timer(d)
389693a245fa perf: add methods for timing changeset file list reading
Matt Mackall <mpm@selenic.com>
parents: 23878
diff changeset
  2143
    fm.end()
389693a245fa perf: add methods for timing changeset file list reading
Matt Mackall <mpm@selenic.com>
parents: 23878
diff changeset
  2144
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2145
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  2146
@command(b'perf::rawfiles|perfrawfiles', formatteropts)
27095
aaf4e2d77148 contrib/perf: name functions to match decorators
timeless <timeless@mozdev.org>
parents: 27072
diff changeset
  2147
def perfrawfiles(ui, repo, x, **opts):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  2148
    opts = _byteskwargs(opts)
24349
389693a245fa perf: add methods for timing changeset file list reading
Matt Mackall <mpm@selenic.com>
parents: 23878
diff changeset
  2149
    x = int(x)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2150
    timer, fm = gettimer(ui, opts)
24349
389693a245fa perf: add methods for timing changeset file list reading
Matt Mackall <mpm@selenic.com>
parents: 23878
diff changeset
  2151
    cl = repo.changelog
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2152
24349
389693a245fa perf: add methods for timing changeset file list reading
Matt Mackall <mpm@selenic.com>
parents: 23878
diff changeset
  2153
    def d():
389693a245fa perf: add methods for timing changeset file list reading
Matt Mackall <mpm@selenic.com>
parents: 23878
diff changeset
  2154
        len(cl.read(x)[3])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2155
24349
389693a245fa perf: add methods for timing changeset file list reading
Matt Mackall <mpm@selenic.com>
parents: 23878
diff changeset
  2156
    timer(d)
389693a245fa perf: add methods for timing changeset file list reading
Matt Mackall <mpm@selenic.com>
parents: 23878
diff changeset
  2157
    fm.end()
389693a245fa perf: add methods for timing changeset file list reading
Matt Mackall <mpm@selenic.com>
parents: 23878
diff changeset
  2158
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2159
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  2160
@command(b'perf::lookup|perflookup', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2161
def perflookup(ui, repo, rev, **opts):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  2162
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2163
    timer, fm = gettimer(ui, opts)
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  2164
    timer(lambda: len(repo.lookup(rev)))
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  2165
    fm.end()
7366
eb240755386d Add contrib/perf.py for performance testing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
  2166
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2167
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2168
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  2169
    b'perf::linelogedits|perflinelogedits',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2170
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2171
        (b'n', b'edits', 10000, b'number of edits'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2172
        (b'', b'max-hunk-lines', 10, b'max lines in a hunk'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2173
    ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2174
    norepo=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2175
)
39007
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2176
def perflinelogedits(ui, **opts):
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2177
    from mercurial import linelog
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2178
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  2179
    opts = _byteskwargs(opts)
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  2180
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  2181
    edits = opts[b'edits']
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  2182
    maxhunklines = opts[b'max_hunk_lines']
39007
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2183
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2184
    maxb1 = 100000
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2185
    random.seed(0)
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2186
    randint = random.randint
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2187
    currentlines = 0
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2188
    arglist = []
39827
86dbeb7c9a11 py3: switch contrib/perf from xrange to pycompat.xrange
Matt Harbison <matt_harbison@yahoo.com>
parents: 39826
diff changeset
  2189
    for rev in _xrange(edits):
39007
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2190
        a1 = randint(0, currentlines)
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2191
        a2 = randint(a1, min(currentlines, a1 + maxhunklines))
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2192
        b1 = randint(0, maxb1)
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2193
        b2 = randint(b1, b1 + maxhunklines)
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2194
        currentlines += (b2 - b1) - (a2 - a1)
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2195
        arglist.append((rev, a1, a2, b1, b2))
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2196
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2197
    def d():
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2198
        ll = linelog.linelog()
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2199
        for args in arglist:
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2200
            ll.replacelines(*args)
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2201
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2202
    timer, fm = gettimer(ui, opts)
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2203
    timer(d)
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2204
    fm.end()
1601afbb573c perf: add a command to benchmark linelog edits
Jun Wu <quark@fb.com>
parents: 38821
diff changeset
  2205
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2206
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  2207
@command(b'perf::revrange|perfrevrange', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2208
def perfrevrange(ui, repo, *specs, **opts):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  2209
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2210
    timer, fm = gettimer(ui, opts)
16858
fdf99e0f60f3 perf: add a benchmark for revrange
Bryan O'Sullivan <bryano@fb.com>
parents: 16802
diff changeset
  2211
    revrange = scmutil.revrange
fdf99e0f60f3 perf: add a benchmark for revrange
Bryan O'Sullivan <bryano@fb.com>
parents: 16802
diff changeset
  2212
    timer(lambda: len(revrange(repo, specs)))
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  2213
    fm.end()
16858
fdf99e0f60f3 perf: add a benchmark for revrange
Bryan O'Sullivan <bryano@fb.com>
parents: 16802
diff changeset
  2214
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2215
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  2216
@command(b'perf::nodelookup|perfnodelookup', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2217
def perfnodelookup(ui, repo, rev, **opts):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  2218
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2219
    timer, fm = gettimer(ui, opts)
16309
e0c1b3ef7c36 perf: node lookup
Matt Mackall <mpm@selenic.com>
parents: 16266
diff changeset
  2220
    import mercurial.revlog
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2221
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2222
    mercurial.revlog._prereadsize = 2 ** 24  # disable lazy parser in old hg
37355
5bcd5859b505 perf: make perfmanifest and perfnodelookup work with revsets
Martin von Zweigbergk <martinvonz@google.com>
parents: 37271
diff changeset
  2223
    n = scmutil.revsingle(repo, rev).node()
47089
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
  2224
47164
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
  2225
    try:
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
  2226
        cl = revlog(getsvfs(repo), radix=b"00changelog")
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
  2227
    except TypeError:
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
  2228
        cl = revlog(getsvfs(repo), indexfile=b"00changelog.i")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2229
16414
e8d37b78acfb parsers: use base-16 trie for faster node->rev mapping
Bryan O'Sullivan <bryano@fb.com>
parents: 16403
diff changeset
  2230
    def d():
e8d37b78acfb parsers: use base-16 trie for faster node->rev mapping
Bryan O'Sullivan <bryano@fb.com>
parents: 16403
diff changeset
  2231
        cl.rev(n)
16785
1dc08dc63c09 perf: rework perfheads and perftags to clear caches
Bryan O'Sullivan <bryano@fb.com>
parents: 16689
diff changeset
  2232
        clearcaches(cl)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2233
16414
e8d37b78acfb parsers: use base-16 trie for faster node->rev mapping
Bryan O'Sullivan <bryano@fb.com>
parents: 16403
diff changeset
  2234
    timer(d)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  2235
    fm.end()
16414
e8d37b78acfb parsers: use base-16 trie for faster node->rev mapping
Bryan O'Sullivan <bryano@fb.com>
parents: 16403
diff changeset
  2236
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2237
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2238
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  2239
    b'perf::log|perflog',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2240
    [(b'', b'rename', False, b'ask log to follow renames')] + formatteropts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2241
)
27306
bafb1235f505 perf: add optional rev for perflog and perftemplating
timeless <timeless@mozdev.org>
parents: 27305
diff changeset
  2242
def perflog(ui, repo, rev=None, **opts):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  2243
    opts = _byteskwargs(opts)
27306
bafb1235f505 perf: add optional rev for perflog and perftemplating
timeless <timeless@mozdev.org>
parents: 27305
diff changeset
  2244
    if rev is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2245
        rev = []
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2246
    timer, fm = gettimer(ui, opts)
7872
f680a1bd679b contrib: add perflog and perftemplating commands to perf extension
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7366
diff changeset
  2247
    ui.pushbuffer()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2248
    timer(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2249
        lambda: commands.log(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2250
            ui, repo, rev=rev, date=b'', user=b'', copies=opts.get(b'rename')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2251
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2252
    )
7872
f680a1bd679b contrib: add perflog and perftemplating commands to perf extension
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7366
diff changeset
  2253
    ui.popbuffer()
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  2254
    fm.end()
7872
f680a1bd679b contrib: add perflog and perftemplating commands to perf extension
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7366
diff changeset
  2255
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2256
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  2257
@command(b'perf::moonwalk|perfmoonwalk', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2258
def perfmoonwalk(ui, repo, **opts):
20178
74aea4be8e78 perf: add perfmoonwalk command to walk the changelog backwards
Brodie Rao <brodie@sf.io>
parents: 20032
diff changeset
  2259
    """benchmark walking the changelog backwards
74aea4be8e78 perf: add perfmoonwalk command to walk the changelog backwards
Brodie Rao <brodie@sf.io>
parents: 20032
diff changeset
  2260
74aea4be8e78 perf: add perfmoonwalk command to walk the changelog backwards
Brodie Rao <brodie@sf.io>
parents: 20032
diff changeset
  2261
    This also loads the changelog data for each revision in the changelog.
74aea4be8e78 perf: add perfmoonwalk command to walk the changelog backwards
Brodie Rao <brodie@sf.io>
parents: 20032
diff changeset
  2262
    """
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  2263
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2264
    timer, fm = gettimer(ui, opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2265
20178
74aea4be8e78 perf: add perfmoonwalk command to walk the changelog backwards
Brodie Rao <brodie@sf.io>
parents: 20032
diff changeset
  2266
    def moonwalk():
38819
a4d847cea6f8 perfmoonwalk: make work with filtered repo
Martin von Zweigbergk <martinvonz@google.com>
parents: 38695
diff changeset
  2267
        for i in repo.changelog.revs(start=(len(repo) - 1), stop=-1):
20178
74aea4be8e78 perf: add perfmoonwalk command to walk the changelog backwards
Brodie Rao <brodie@sf.io>
parents: 20032
diff changeset
  2268
            ctx = repo[i]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2269
            ctx.branch()  # read changelog data (in addition to the index)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2270
20178
74aea4be8e78 perf: add perfmoonwalk command to walk the changelog backwards
Brodie Rao <brodie@sf.io>
parents: 20032
diff changeset
  2271
    timer(moonwalk)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  2272
    fm.end()
20178
74aea4be8e78 perf: add perfmoonwalk command to walk the changelog backwards
Brodie Rao <brodie@sf.io>
parents: 20032
diff changeset
  2273
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2274
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2275
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  2276
    b'perf::templating|perftemplating',
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2277
    [
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2278
        (b'r', b'rev', [], b'revisions to run the template on'),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2279
    ]
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2280
    + formatteropts,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2281
)
38270
ae6e02fcee24 perftemplating: allow to specify the template to test
Boris Feld <boris.feld@octobus.net>
parents: 38269
diff changeset
  2282
def perftemplating(ui, repo, testedtemplate=None, **opts):
ae6e02fcee24 perftemplating: allow to specify the template to test
Boris Feld <boris.feld@octobus.net>
parents: 38269
diff changeset
  2283
    """test the rendering time of a given template"""
38269
a577a199983c perftemplating: stop going through the log command
Boris Feld <boris.feld@octobus.net>
parents: 38268
diff changeset
  2284
    if makelogtemplater is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2285
        raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2286
            b"perftemplating not available with this Mercurial",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2287
            hint=b"use 4.3 or later",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2288
        )
38269
a577a199983c perftemplating: stop going through the log command
Boris Feld <boris.feld@octobus.net>
parents: 38268
diff changeset
  2289
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  2290
    opts = _byteskwargs(opts)
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  2291
38267
71d59b487d0c perftemplating: drop usage of buffer
Boris Feld <boris.feld@octobus.net>
parents: 38266
diff changeset
  2292
    nullui = ui.copy()
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43551
diff changeset
  2293
    nullui.fout = open(os.devnull, 'wb')
38267
71d59b487d0c perftemplating: drop usage of buffer
Boris Feld <boris.feld@octobus.net>
parents: 38266
diff changeset
  2294
    nullui.disablepager()
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  2295
    revs = opts.get(b'rev')
38269
a577a199983c perftemplating: stop going through the log command
Boris Feld <boris.feld@octobus.net>
parents: 38268
diff changeset
  2296
    if not revs:
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  2297
        revs = [b'all()']
38269
a577a199983c perftemplating: stop going through the log command
Boris Feld <boris.feld@octobus.net>
parents: 38268
diff changeset
  2298
    revs = list(scmutil.revrange(repo, revs))
a577a199983c perftemplating: stop going through the log command
Boris Feld <boris.feld@octobus.net>
parents: 38268
diff changeset
  2299
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2300
    defaulttemplate = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2301
        b'{date|shortdate} [{rev}:{node|short}]'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2302
        b' {author|person}: {desc|firstline}\n'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2303
    )
38270
ae6e02fcee24 perftemplating: allow to specify the template to test
Boris Feld <boris.feld@octobus.net>
parents: 38269
diff changeset
  2304
    if testedtemplate is None:
ae6e02fcee24 perftemplating: allow to specify the template to test
Boris Feld <boris.feld@octobus.net>
parents: 38269
diff changeset
  2305
        testedtemplate = defaulttemplate
ae6e02fcee24 perftemplating: allow to specify the template to test
Boris Feld <boris.feld@octobus.net>
parents: 38269
diff changeset
  2306
    displayer = makelogtemplater(nullui, repo, testedtemplate)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2307
38266
6b91815fcdce perftemplating: move template formating into its own function
Boris Feld <boris.feld@octobus.net>
parents: 38265
diff changeset
  2308
    def format():
38269
a577a199983c perftemplating: stop going through the log command
Boris Feld <boris.feld@octobus.net>
parents: 38268
diff changeset
  2309
        for r in revs:
a577a199983c perftemplating: stop going through the log command
Boris Feld <boris.feld@octobus.net>
parents: 38268
diff changeset
  2310
            ctx = repo[r]
a577a199983c perftemplating: stop going through the log command
Boris Feld <boris.feld@octobus.net>
parents: 38268
diff changeset
  2311
            displayer.show(ctx)
a577a199983c perftemplating: stop going through the log command
Boris Feld <boris.feld@octobus.net>
parents: 38268
diff changeset
  2312
            displayer.flush(ctx)
38266
6b91815fcdce perftemplating: move template formating into its own function
Boris Feld <boris.feld@octobus.net>
parents: 38265
diff changeset
  2313
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2314
    timer, fm = gettimer(ui, opts)
38266
6b91815fcdce perftemplating: move template formating into its own function
Boris Feld <boris.feld@octobus.net>
parents: 38265
diff changeset
  2315
    timer(format)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  2316
    fm.end()
7872
f680a1bd679b contrib: add perflog and perftemplating commands to perf extension
Alexander Solovyov <piranha@piranha.org.ua>
parents: 7366
diff changeset
  2317
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2318
42945
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2319
def _displaystats(ui, opts, entries, data):
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2320
    # use a second formatter because the data are quite different, not sure
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2321
    # how it flies with the templater.
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2322
    fm = ui.formatter(b'perf-stats', opts)
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2323
    for key, title in entries:
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2324
        values = data[key]
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2325
        nbvalues = len(data)
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2326
        values.sort()
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2327
        stats = {
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2328
            'key': key,
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2329
            'title': title,
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2330
            'nbitems': len(values),
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2331
            'min': values[0][0],
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2332
            '10%': values[(nbvalues * 10) // 100][0],
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2333
            '25%': values[(nbvalues * 25) // 100][0],
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2334
            '50%': values[(nbvalues * 50) // 100][0],
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2335
            '75%': values[(nbvalues * 75) // 100][0],
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2336
            '80%': values[(nbvalues * 80) // 100][0],
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2337
            '85%': values[(nbvalues * 85) // 100][0],
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2338
            '90%': values[(nbvalues * 90) // 100][0],
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2339
            '95%': values[(nbvalues * 95) // 100][0],
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2340
            '99%': values[(nbvalues * 99) // 100][0],
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2341
            'max': values[-1][0],
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2342
        }
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2343
        fm.startitem()
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2344
        fm.data(**stats)
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2345
        # make node pretty for the human output
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2346
        fm.plain('### %s (%d items)\n' % (title, len(values)))
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2347
        lines = [
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2348
            'min',
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2349
            '10%',
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2350
            '25%',
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2351
            '50%',
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2352
            '75%',
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2353
            '80%',
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2354
            '85%',
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2355
            '90%',
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2356
            '95%',
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2357
            '99%',
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2358
            'max',
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2359
        ]
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2360
        for l in lines:
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2361
            fm.plain('%s: %s\n' % (l, stats[l]))
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2362
    fm.end()
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2363
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2364
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2365
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  2366
    b'perf::helper-mergecopies|perfhelper-mergecopies',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2367
    formatteropts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2368
    + [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2369
        (b'r', b'revs', [], b'restrict search to these revisions'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2370
        (b'', b'timing', False, b'provides extra data (costly)'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2371
        (b'', b'stats', False, b'provides statistic about the measured data'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2372
    ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2373
)
42404
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2374
def perfhelpermergecopies(ui, repo, revs=[], **opts):
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2375
    """find statistics about potential parameters for `perfmergecopies`
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2376
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2377
    This command find (base, p1, p2) triplet relevant for copytracing
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2378
    benchmarking in the context of a merge.  It reports values for some of the
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2379
    parameters that impact merge copy tracing time during merge.
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2380
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2381
    If `--timing` is set, rename detection is run and the associated timing
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2382
    will be reported. The extra details come at the cost of slower command
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2383
    execution.
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2384
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2385
    Since rename detection is only run once, other factors might easily
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2386
    affect the precision of the timing. However it should give a good
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2387
    approximation of which revision triplets are very costly.
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2388
    """
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2389
    opts = _byteskwargs(opts)
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2390
    fm = ui.formatter(b'perf', opts)
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2391
    dotiming = opts[b'timing']
42945
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2392
    dostats = opts[b'stats']
42404
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2393
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2394
    output_template = [
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2395
        ("base", "%(base)12s"),
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2396
        ("p1", "%(p1.node)12s"),
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2397
        ("p2", "%(p2.node)12s"),
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2398
        ("p1.nb-revs", "%(p1.nbrevs)12d"),
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2399
        ("p1.nb-files", "%(p1.nbmissingfiles)12d"),
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2400
        ("p1.renames", "%(p1.renamedfiles)12d"),
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2401
        ("p1.time", "%(p1.time)12.3f"),
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2402
        ("p2.nb-revs", "%(p2.nbrevs)12d"),
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2403
        ("p2.nb-files", "%(p2.nbmissingfiles)12d"),
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2404
        ("p2.renames", "%(p2.renamedfiles)12d"),
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2405
        ("p2.time", "%(p2.time)12.3f"),
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2406
        ("renames", "%(nbrenamedfiles)12d"),
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2407
        ("total.time", "%(time)12.3f"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2408
    ]
42404
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2409
    if not dotiming:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2410
        output_template = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2411
            i
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2412
            for i in output_template
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2413
            if not ('time' in i[0] or 'renames' in i[0])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2414
        ]
42404
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2415
    header_names = [h for (h, v) in output_template]
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2416
    output = ' '.join([v for (h, v) in output_template]) + '\n'
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2417
    header = ' '.join(['%12s'] * len(header_names)) + '\n'
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2418
    fm.plain(header % tuple(header_names))
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2419
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2420
    if not revs:
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2421
        revs = ['all()']
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2422
    revs = scmutil.revrange(repo, revs)
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2423
42945
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2424
    if dostats:
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2425
        alldata = {
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2426
            'nbrevs': [],
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2427
            'nbmissingfiles': [],
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2428
        }
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2429
        if dotiming:
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2430
            alldata['parentnbrenames'] = []
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2431
            alldata['totalnbrenames'] = []
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2432
            alldata['parenttime'] = []
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2433
            alldata['totaltime'] = []
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2434
42404
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2435
    roi = repo.revs('merge() and %ld', revs)
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2436
    for r in roi:
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2437
        ctx = repo[r]
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2438
        p1 = ctx.p1()
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2439
        p2 = ctx.p2()
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2440
        bases = repo.changelog._commonancestorsheads(p1.rev(), p2.rev())
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2441
        for b in bases:
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2442
            b = repo[b]
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2443
            p1missing = copies._computeforwardmissing(b, p1)
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2444
            p2missing = copies._computeforwardmissing(b, p2)
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2445
            data = {
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2446
                b'base': b.hex(),
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2447
                b'p1.node': p1.hex(),
43161
9d57c2df7b5f perf: fix `perfhelper-mergecopies` report of #changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43160
diff changeset
  2448
                b'p1.nbrevs': len(repo.revs('only(%d, %d)', p1.rev(), b.rev())),
42404
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2449
                b'p1.nbmissingfiles': len(p1missing),
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2450
                b'p2.node': p2.hex(),
43161
9d57c2df7b5f perf: fix `perfhelper-mergecopies` report of #changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43160
diff changeset
  2451
                b'p2.nbrevs': len(repo.revs('only(%d, %d)', p2.rev(), b.rev())),
42404
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2452
                b'p2.nbmissingfiles': len(p2missing),
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2453
            }
42945
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2454
            if dostats:
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2455
                if p1missing:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2456
                    alldata['nbrevs'].append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2457
                        (data['p1.nbrevs'], b.hex(), p1.hex())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2458
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2459
                    alldata['nbmissingfiles'].append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2460
                        (data['p1.nbmissingfiles'], b.hex(), p1.hex())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2461
                    )
42945
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2462
                if p2missing:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2463
                    alldata['nbrevs'].append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2464
                        (data['p2.nbrevs'], b.hex(), p2.hex())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2465
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2466
                    alldata['nbmissingfiles'].append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2467
                        (data['p2.nbmissingfiles'], b.hex(), p2.hex())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2468
                    )
42404
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2469
            if dotiming:
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2470
                begin = util.timer()
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2471
                mergedata = copies.mergecopies(repo, p1, p2, b)
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2472
                end = util.timer()
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2473
                # not very stable timing since we did only one run
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2474
                data['time'] = end - begin
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2475
                # mergedata contains five dicts: "copy", "movewithdir",
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2476
                # "diverge", "renamedelete" and "dirmove".
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2477
                # The first 4 are about renamed file so lets count that.
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2478
                renames = len(mergedata[0])
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2479
                renames += len(mergedata[1])
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2480
                renames += len(mergedata[2])
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2481
                renames += len(mergedata[3])
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2482
                data['nbrenamedfiles'] = renames
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2483
                begin = util.timer()
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2484
                p1renames = copies.pathcopies(b, p1)
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2485
                end = util.timer()
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2486
                data['p1.time'] = end - begin
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2487
                begin = util.timer()
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2488
                p2renames = copies.pathcopies(b, p2)
43979
a2ad5aeedfdf perf: fix the time measurement for pathcopies relative to p2
Matt Harbison <matt_harbison@yahoo.com>
parents: 43697
diff changeset
  2489
                end = util.timer()
42404
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2490
                data['p2.time'] = end - begin
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2491
                data['p1.renamedfiles'] = len(p1renames)
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2492
                data['p2.renamedfiles'] = len(p2renames)
42945
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2493
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2494
                if dostats:
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2495
                    if p1missing:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2496
                        alldata['parentnbrenames'].append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2497
                            (data['p1.renamedfiles'], b.hex(), p1.hex())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2498
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2499
                        alldata['parenttime'].append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2500
                            (data['p1.time'], b.hex(), p1.hex())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2501
                        )
42945
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2502
                    if p2missing:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2503
                        alldata['parentnbrenames'].append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2504
                            (data['p2.renamedfiles'], b.hex(), p2.hex())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2505
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2506
                        alldata['parenttime'].append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2507
                            (data['p2.time'], b.hex(), p2.hex())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2508
                        )
42945
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2509
                    if p1missing or p2missing:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2510
                        alldata['totalnbrenames'].append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2511
                            (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2512
                                data['nbrenamedfiles'],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2513
                                b.hex(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2514
                                p1.hex(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2515
                                p2.hex(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2516
                            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2517
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2518
                        alldata['totaltime'].append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2519
                            (data['time'], b.hex(), p1.hex(), p2.hex())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2520
                        )
42404
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2521
            fm.startitem()
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2522
            fm.data(**data)
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2523
            # make node pretty for the human output
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2524
            out = data.copy()
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2525
            out['base'] = fm.hexfunc(b.node())
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2526
            out['p1.node'] = fm.hexfunc(p1.node())
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2527
            out['p2.node'] = fm.hexfunc(p2.node())
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2528
            fm.plain(output % out)
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2529
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2530
    fm.end()
42945
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2531
    if dostats:
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2532
        # use a second formatter because the data are quite different, not sure
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2533
        # how it flies with the templater.
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2534
        entries = [
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2535
            ('nbrevs', 'number of revision covered'),
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2536
            ('nbmissingfiles', 'number of missing files at head'),
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2537
        ]
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2538
        if dotiming:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2539
            entries.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2540
                ('parentnbrenames', 'rename from one parent to base')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2541
            )
42945
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2542
            entries.append(('totalnbrenames', 'total number of renames'))
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2543
            entries.append(('parenttime', 'time for one parent'))
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2544
            entries.append(('totaltime', 'time for both parents'))
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2545
        _displaystats(ui, opts, entries, alldata)
3a1ad3aeb64a perf: add a --stats argument to perfhelper-mergecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42801
diff changeset
  2546
42404
21c436a3a4e8 perf: add a `perfhelper-mergecopies` command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42403
diff changeset
  2547
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2548
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  2549
    b'perf::helper-pathcopies|perfhelper-pathcopies',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2550
    formatteropts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2551
    + [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2552
        (b'r', b'revs', [], b'restrict search to these revisions'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2553
        (b'', b'timing', False, b'provides extra data (costly)'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2554
        (b'', b'stats', False, b'provides statistic about the measured data'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2555
    ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2556
)
40774
30d878cb102d perf: rename `perfhelper-tracecopies` to `perfhelper-pathcopies`
Boris Feld <boris.feld@octobus.net>
parents: 40773
diff changeset
  2557
def perfhelperpathcopies(ui, repo, revs=[], **opts):
40730
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2558
    """find statistic about potential parameters for the `perftracecopies`
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2559
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2560
    This command find source-destination pair relevant for copytracing testing.
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2561
    It report value for some of the parameters that impact copy tracing time.
40765
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2562
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2563
    If `--timing` is set, rename detection is run and the associated timing
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2564
    will be reported. The extra details comes at the cost of a slower command
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2565
    execution.
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2566
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2567
    Since the rename detection is only run once, other factors might easily
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2568
    affect the precision of the timing. However it should give a good
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2569
    approximation of which revision pairs are very costly.
40730
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2570
    """
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2571
    opts = _byteskwargs(opts)
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2572
    fm = ui.formatter(b'perf', opts)
40765
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2573
    dotiming = opts[b'timing']
42946
adac17faa72e perf: add a --stats argument to perfhelper-pathcopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42945
diff changeset
  2574
    dostats = opts[b'stats']
40765
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2575
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2576
    if dotiming:
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2577
        header = '%12s %12s %12s %12s %12s %12s\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2578
        output = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2579
            "%(source)12s %(destination)12s "
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2580
            "%(nbrevs)12d %(nbmissingfiles)12d "
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2581
            "%(nbrenamedfiles)12d %(time)18.5f\n"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2582
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2583
        header_names = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2584
            "source",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2585
            "destination",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2586
            "nb-revs",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2587
            "nb-files",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2588
            "nb-renames",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2589
            "time",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2590
        )
40765
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2591
        fm.plain(header % header_names)
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2592
    else:
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2593
        header = '%12s %12s %12s %12s\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2594
        output = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2595
            "%(source)12s %(destination)12s "
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2596
            "%(nbrevs)12d %(nbmissingfiles)12d\n"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2597
        )
40765
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2598
        fm.plain(header % ("source", "destination", "nb-revs", "nb-files"))
40730
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2599
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2600
    if not revs:
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2601
        revs = ['all()']
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2602
    revs = scmutil.revrange(repo, revs)
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2603
42946
adac17faa72e perf: add a --stats argument to perfhelper-pathcopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42945
diff changeset
  2604
    if dostats:
adac17faa72e perf: add a --stats argument to perfhelper-pathcopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42945
diff changeset
  2605
        alldata = {
adac17faa72e perf: add a --stats argument to perfhelper-pathcopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42945
diff changeset
  2606
            'nbrevs': [],
adac17faa72e perf: add a --stats argument to perfhelper-pathcopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42945
diff changeset
  2607
            'nbmissingfiles': [],
adac17faa72e perf: add a --stats argument to perfhelper-pathcopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42945
diff changeset
  2608
        }
adac17faa72e perf: add a --stats argument to perfhelper-pathcopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42945
diff changeset
  2609
        if dotiming:
adac17faa72e perf: add a --stats argument to perfhelper-pathcopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42945
diff changeset
  2610
            alldata['nbrenames'] = []
adac17faa72e perf: add a --stats argument to perfhelper-pathcopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42945
diff changeset
  2611
            alldata['time'] = []
adac17faa72e perf: add a --stats argument to perfhelper-pathcopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42945
diff changeset
  2612
40730
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2613
    roi = repo.revs('merge() and %ld', revs)
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2614
    for r in roi:
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2615
        ctx = repo[r]
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2616
        p1 = ctx.p1().rev()
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2617
        p2 = ctx.p2().rev()
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2618
        bases = repo.changelog._commonancestorsheads(p1, p2)
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2619
        for p in (p1, p2):
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2620
            for b in bases:
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2621
                base = repo[b]
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2622
                parent = repo[p]
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2623
                missing = copies._computeforwardmissing(base, parent)
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2624
                if not missing:
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2625
                    continue
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2626
                data = {
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2627
                    b'source': base.hex(),
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2628
                    b'destination': parent.hex(),
43160
84a950007619 perf: fix `perfhelper-pathcopies` report of #changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43130
diff changeset
  2629
                    b'nbrevs': len(repo.revs('only(%d, %d)', p, b)),
40730
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2630
                    b'nbmissingfiles': len(missing),
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2631
                }
43005
bbf77341a956 perf: fix perfhelper-pathcopies without --stats
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42981
diff changeset
  2632
                if dostats:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2633
                    alldata['nbrevs'].append(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2634
                        (
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2635
                            data['nbrevs'],
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2636
                            base.hex(),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2637
                            parent.hex(),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2638
                        )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2639
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2640
                    alldata['nbmissingfiles'].append(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2641
                        (
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2642
                            data['nbmissingfiles'],
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2643
                            base.hex(),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2644
                            parent.hex(),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2645
                        )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2646
                    )
40765
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2647
                if dotiming:
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2648
                    begin = util.timer()
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2649
                    renames = copies.pathcopies(base, parent)
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2650
                    end = util.timer()
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2651
                    # not very stable timing since we did only one run
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2652
                    data['time'] = end - begin
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2653
                    data['nbrenamedfiles'] = len(renames)
43005
bbf77341a956 perf: fix perfhelper-pathcopies without --stats
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42981
diff changeset
  2654
                    if dostats:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2655
                        alldata['time'].append(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2656
                            (
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2657
                                data['time'],
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2658
                                base.hex(),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2659
                                parent.hex(),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2660
                            )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2661
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2662
                        alldata['nbrenames'].append(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2663
                            (
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2664
                                data['nbrenamedfiles'],
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2665
                                base.hex(),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2666
                                parent.hex(),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  2667
                            )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2668
                        )
40765
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2669
                fm.startitem()
40730
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2670
                fm.data(**data)
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2671
                out = data.copy()
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2672
                out['source'] = fm.hexfunc(base.node())
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2673
                out['destination'] = fm.hexfunc(parent.node())
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2674
                fm.plain(output % out)
40765
36077a0f6f12 perf: add a `--timing` argument to `perfhelper-tracecopies`
Boris Feld <boris.feld@octobus.net>
parents: 40760
diff changeset
  2675
40730
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2676
    fm.end()
42946
adac17faa72e perf: add a --stats argument to perfhelper-pathcopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42945
diff changeset
  2677
    if dostats:
adac17faa72e perf: add a --stats argument to perfhelper-pathcopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42945
diff changeset
  2678
        entries = [
adac17faa72e perf: add a --stats argument to perfhelper-pathcopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42945
diff changeset
  2679
            ('nbrevs', 'number of revision covered'),
adac17faa72e perf: add a --stats argument to perfhelper-pathcopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42945
diff changeset
  2680
            ('nbmissingfiles', 'number of missing files at head'),
adac17faa72e perf: add a --stats argument to perfhelper-pathcopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42945
diff changeset
  2681
        ]
adac17faa72e perf: add a --stats argument to perfhelper-pathcopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42945
diff changeset
  2682
        if dotiming:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2683
            entries.append(('nbrenames', 'renamed files'))
42946
adac17faa72e perf: add a --stats argument to perfhelper-pathcopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42945
diff changeset
  2684
            entries.append(('time', 'time'))
adac17faa72e perf: add a --stats argument to perfhelper-pathcopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42945
diff changeset
  2685
        _displaystats(ui, opts, entries, alldata)
40730
a65fe13de84f perf: add a new `perfhelper-tracecopies` command
Boris Feld <boris.feld@octobus.net>
parents: 40722
diff changeset
  2686
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2687
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  2688
@command(b'perf::cca|perfcca', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2689
def perfcca(ui, repo, **opts):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  2690
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2691
    timer, fm = gettimer(ui, opts)
17216
01c1ee4bd1dd perf: fix perfcca to work with new casecollisionauditor interface
Joshua Redstone <joshua.redstone@fb.com>
parents: 16866
diff changeset
  2692
    timer(lambda: scmutil.casecollisionauditor(ui, False, repo.dirstate))
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  2693
    fm.end()
16386
ccc173d0914e perf: add case collision auditor perf
Matt Mackall <mpm@selenic.com>
parents: 16309
diff changeset
  2694
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2695
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  2696
@command(b'perf::fncacheload|perffncacheload', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2697
def perffncacheload(ui, repo, **opts):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  2698
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2699
    timer, fm = gettimer(ui, opts)
17780
769f66861eb8 perf: simply use repo.store for perffncache* commands
Adrian Buehlmann <adrian@cadifra.com>
parents: 17553
diff changeset
  2700
    s = repo.store
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2701
16403
efae1fea4bbd perf: time fncache read and write performance
Bryan O'Sullivan <bryano@fb.com>
parents: 16386
diff changeset
  2702
    def d():
efae1fea4bbd perf: time fncache read and write performance
Bryan O'Sullivan <bryano@fb.com>
parents: 16386
diff changeset
  2703
        s.fncache._load()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2704
16403
efae1fea4bbd perf: time fncache read and write performance
Bryan O'Sullivan <bryano@fb.com>
parents: 16386
diff changeset
  2705
    timer(d)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  2706
    fm.end()
16403
efae1fea4bbd perf: time fncache read and write performance
Bryan O'Sullivan <bryano@fb.com>
parents: 16386
diff changeset
  2707
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2708
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  2709
@command(b'perf::fncachewrite|perffncachewrite', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2710
def perffncachewrite(ui, repo, **opts):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  2711
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2712
    timer, fm = gettimer(ui, opts)
17780
769f66861eb8 perf: simply use repo.store for perffncache* commands
Adrian Buehlmann <adrian@cadifra.com>
parents: 17553
diff changeset
  2713
    s = repo.store
38695
2cdb82e8fb44 perffncachewrite: load fncache after lock is acquired
Boris Feld <boris.feld@octobus.net>
parents: 38694
diff changeset
  2714
    lock = repo.lock()
16403
efae1fea4bbd perf: time fncache read and write performance
Bryan O'Sullivan <bryano@fb.com>
parents: 16386
diff changeset
  2715
    s.fncache._load()
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  2716
    tr = repo.transaction(b'perffncachewrite')
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  2717
    tr.addbackup(b'fncache')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2718
16403
efae1fea4bbd perf: time fncache read and write performance
Bryan O'Sullivan <bryano@fb.com>
parents: 16386
diff changeset
  2719
    def d():
efae1fea4bbd perf: time fncache read and write performance
Bryan O'Sullivan <bryano@fb.com>
parents: 16386
diff changeset
  2720
        s.fncache._dirty = True
27097
b3e24a9c5f9b contrib/perf: fix perffncachewrite
timeless <timeless@mozdev.org>
parents: 27096
diff changeset
  2721
        s.fncache.write(tr)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2722
16403
efae1fea4bbd perf: time fncache read and write performance
Bryan O'Sullivan <bryano@fb.com>
parents: 16386
diff changeset
  2723
    timer(d)
30069
98b9846a131e perf: release lock after transaction in perffncachewrite
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30020
diff changeset
  2724
    tr.close()
27097
b3e24a9c5f9b contrib/perf: fix perffncachewrite
timeless <timeless@mozdev.org>
parents: 27096
diff changeset
  2725
    lock.release()
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  2726
    fm.end()
16403
efae1fea4bbd perf: time fncache read and write performance
Bryan O'Sullivan <bryano@fb.com>
parents: 16386
diff changeset
  2727
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2728
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  2729
@command(b'perf::fncacheencode|perffncacheencode', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2730
def perffncacheencode(ui, repo, **opts):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  2731
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  2732
    timer, fm = gettimer(ui, opts)
17780
769f66861eb8 perf: simply use repo.store for perffncache* commands
Adrian Buehlmann <adrian@cadifra.com>
parents: 17553
diff changeset
  2733
    s = repo.store
17553
5ab863922e0f perf: add perffncacheencode
Adrian Buehlmann <adrian@cadifra.com>
parents: 17216
diff changeset
  2734
    s.fncache._load()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2735
17553
5ab863922e0f perf: add perffncacheencode
Adrian Buehlmann <adrian@cadifra.com>
parents: 17216
diff changeset
  2736
    def d():
5ab863922e0f perf: add perffncacheencode
Adrian Buehlmann <adrian@cadifra.com>
parents: 17216
diff changeset
  2737
        for p in s.fncache.entries:
5ab863922e0f perf: add perffncacheencode
Adrian Buehlmann <adrian@cadifra.com>
parents: 17216
diff changeset
  2738
            s.encode(p)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2739
17553
5ab863922e0f perf: add perffncacheencode
Adrian Buehlmann <adrian@cadifra.com>
parents: 17216
diff changeset
  2740
    timer(d)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  2741
    fm.end()
17553
5ab863922e0f perf: add perffncacheencode
Adrian Buehlmann <adrian@cadifra.com>
parents: 17216
diff changeset
  2742
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2743
36774
d382344c69aa perf: teach perfbdiff to call blocks() and to use xdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36393
diff changeset
  2744
def _bdiffworker(q, blocks, xdiff, ready, done):
35599
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2745
    while not done.is_set():
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2746
        pair = q.get()
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2747
        while pair is not None:
36774
d382344c69aa perf: teach perfbdiff to call blocks() and to use xdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36393
diff changeset
  2748
            if xdiff:
d382344c69aa perf: teach perfbdiff to call blocks() and to use xdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36393
diff changeset
  2749
                mdiff.bdiff.xdiffblocks(*pair)
d382344c69aa perf: teach perfbdiff to call blocks() and to use xdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36393
diff changeset
  2750
            elif blocks:
d382344c69aa perf: teach perfbdiff to call blocks() and to use xdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36393
diff changeset
  2751
                mdiff.bdiff.blocks(*pair)
d382344c69aa perf: teach perfbdiff to call blocks() and to use xdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36393
diff changeset
  2752
            else:
d382344c69aa perf: teach perfbdiff to call blocks() and to use xdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36393
diff changeset
  2753
                mdiff.textdiff(*pair)
35599
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2754
            q.task_done()
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2755
            pair = q.get()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2756
        q.task_done()  # for the None one
35599
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2757
        with ready:
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2758
            ready.wait()
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2759
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2760
39346
862d23bc5749 perf: add function for obtaining manifest revision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39345
diff changeset
  2761
def _manifestrevision(repo, mnode):
862d23bc5749 perf: add function for obtaining manifest revision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39345
diff changeset
  2762
    ml = repo.manifestlog
862d23bc5749 perf: add function for obtaining manifest revision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39345
diff changeset
  2763
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  2764
    if util.safehasattr(ml, b'getstorage'):
39346
862d23bc5749 perf: add function for obtaining manifest revision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39345
diff changeset
  2765
        store = ml.getstorage(b'')
862d23bc5749 perf: add function for obtaining manifest revision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39345
diff changeset
  2766
    else:
862d23bc5749 perf: add function for obtaining manifest revision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39345
diff changeset
  2767
        store = ml._revlog
862d23bc5749 perf: add function for obtaining manifest revision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39345
diff changeset
  2768
862d23bc5749 perf: add function for obtaining manifest revision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39345
diff changeset
  2769
    return store.revision(mnode)
862d23bc5749 perf: add function for obtaining manifest revision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39345
diff changeset
  2770
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2771
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2772
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  2773
    b'perf::bdiff|perfbdiff',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2774
    revlogopts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2775
    + formatteropts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2776
    + [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2777
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2778
            b'',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2779
            b'count',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2780
            1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2781
            b'number of revisions to test (when using --startrev)',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2782
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2783
        (b'', b'alldata', False, b'test bdiffs for all associated revisions'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2784
        (b'', b'threads', 0, b'number of thread to use (disable with 0)'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2785
        (b'', b'blocks', False, b'test computing diffs into blocks'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2786
        (b'', b'xdiff', False, b'use xdiff algorithm'),
35599
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2787
    ],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2788
    b'-c|-m|FILE REV',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2789
)
35599
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2790
def perfbdiff(ui, repo, file_, rev=None, count=None, threads=0, **opts):
30346
7ddc8f8d7712 perf: support bdiffing multiple revisions in a single revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30345
diff changeset
  2791
    """benchmark a bdiff between revisions
7ddc8f8d7712 perf: support bdiffing multiple revisions in a single revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30345
diff changeset
  2792
7ddc8f8d7712 perf: support bdiffing multiple revisions in a single revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30345
diff changeset
  2793
    By default, benchmark a bdiff between its delta parent and itself.
7ddc8f8d7712 perf: support bdiffing multiple revisions in a single revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30345
diff changeset
  2794
7ddc8f8d7712 perf: support bdiffing multiple revisions in a single revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30345
diff changeset
  2795
    With ``--count``, benchmark bdiffs between delta parents and self for N
7ddc8f8d7712 perf: support bdiffing multiple revisions in a single revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30345
diff changeset
  2796
    revisions starting at the specified revision.
30347
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2797
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2798
    With ``--alldata``, assume the requested revision is a changeset and
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2799
    measure bdiffs for all changes related to that changeset (manifest
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2800
    and filelogs).
30346
7ddc8f8d7712 perf: support bdiffing multiple revisions in a single revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30345
diff changeset
  2801
    """
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  2802
    opts = _byteskwargs(opts)
36774
d382344c69aa perf: teach perfbdiff to call blocks() and to use xdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36393
diff changeset
  2803
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  2804
    if opts[b'xdiff'] and not opts[b'blocks']:
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  2805
        raise error.CommandError(b'perfbdiff', b'--xdiff requires --blocks')
36774
d382344c69aa perf: teach perfbdiff to call blocks() and to use xdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36393
diff changeset
  2806
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  2807
    if opts[b'alldata']:
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  2808
        opts[b'changelog'] = True
30347
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2809
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  2810
    if opts.get(b'changelog') or opts.get(b'manifest'):
30320
c8fa7ad1ff90 perf: add perfbdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30219
diff changeset
  2811
        file_, rev = None, file_
c8fa7ad1ff90 perf: add perfbdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30219
diff changeset
  2812
    elif rev is None:
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  2813
        raise error.CommandError(b'perfbdiff', b'invalid arguments')
30320
c8fa7ad1ff90 perf: add perfbdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30219
diff changeset
  2814
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  2815
    blocks = opts[b'blocks']
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  2816
    xdiff = opts[b'xdiff']
30345
7d91a085ebe6 perf: prepare to handle multiple pairs in perfbdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30320
diff changeset
  2817
    textpairs = []
7d91a085ebe6 perf: prepare to handle multiple pairs in perfbdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30320
diff changeset
  2818
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  2819
    r = cmdutil.openrevlog(repo, b'perfbdiff', file_, opts)
30320
c8fa7ad1ff90 perf: add perfbdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30219
diff changeset
  2820
30346
7ddc8f8d7712 perf: support bdiffing multiple revisions in a single revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30345
diff changeset
  2821
    startrev = r.rev(r.lookup(rev))
7ddc8f8d7712 perf: support bdiffing multiple revisions in a single revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30345
diff changeset
  2822
    for rev in range(startrev, min(startrev + count, len(r) - 1)):
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  2823
        if opts[b'alldata']:
30347
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2824
            # Load revisions associated with changeset.
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2825
            ctx = repo[rev]
39346
862d23bc5749 perf: add function for obtaining manifest revision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39345
diff changeset
  2826
            mtext = _manifestrevision(repo, ctx.manifestnode())
30347
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2827
            for pctx in ctx.parents():
39346
862d23bc5749 perf: add function for obtaining manifest revision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39345
diff changeset
  2828
                pman = _manifestrevision(repo, pctx.manifestnode())
30347
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2829
                textpairs.append((pman, mtext))
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2830
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2831
            # Load filelog revisions by iterating manifest delta.
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2832
            man = ctx.manifest()
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2833
            pman = ctx.p1().manifest()
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2834
            for filename, change in pman.diff(man).items():
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2835
                fctx = repo.file(filename)
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2836
                f1 = fctx.revision(change[0][0] or -1)
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2837
                f2 = fctx.revision(change[1][0] or -1)
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2838
                textpairs.append((f1, f2))
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2839
        else:
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2840
            dp = r.deltaparent(rev)
6ecad4b73569 perf: support measuring bdiff for all changeset related data
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30346
diff changeset
  2841
            textpairs.append((r.revision(dp), r.revision(rev)))
30320
c8fa7ad1ff90 perf: add perfbdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30219
diff changeset
  2842
35599
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2843
    withthreads = threads > 0
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2844
    if not withthreads:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2845
35599
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2846
        def d():
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2847
            for pair in textpairs:
36774
d382344c69aa perf: teach perfbdiff to call blocks() and to use xdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36393
diff changeset
  2848
                if xdiff:
d382344c69aa perf: teach perfbdiff to call blocks() and to use xdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36393
diff changeset
  2849
                    mdiff.bdiff.xdiffblocks(*pair)
d382344c69aa perf: teach perfbdiff to call blocks() and to use xdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36393
diff changeset
  2850
                elif blocks:
d382344c69aa perf: teach perfbdiff to call blocks() and to use xdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36393
diff changeset
  2851
                    mdiff.bdiff.blocks(*pair)
d382344c69aa perf: teach perfbdiff to call blocks() and to use xdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36393
diff changeset
  2852
                else:
d382344c69aa perf: teach perfbdiff to call blocks() and to use xdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36393
diff changeset
  2853
                    mdiff.textdiff(*pair)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2854
35599
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2855
    else:
37890
8fb9985382be pycompat: export queue module instead of symbols in module (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37355
diff changeset
  2856
        q = queue()
39827
86dbeb7c9a11 py3: switch contrib/perf from xrange to pycompat.xrange
Matt Harbison <matt_harbison@yahoo.com>
parents: 39826
diff changeset
  2857
        for i in _xrange(threads):
35599
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2858
            q.put(None)
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2859
        ready = threading.Condition()
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2860
        done = threading.Event()
39827
86dbeb7c9a11 py3: switch contrib/perf from xrange to pycompat.xrange
Matt Harbison <matt_harbison@yahoo.com>
parents: 39826
diff changeset
  2861
        for i in _xrange(threads):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2862
            threading.Thread(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2863
                target=_bdiffworker, args=(q, blocks, xdiff, ready, done)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2864
            ).start()
35599
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2865
        q.join()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2866
35599
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2867
        def d():
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2868
            for pair in textpairs:
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2869
                q.put(pair)
39827
86dbeb7c9a11 py3: switch contrib/perf from xrange to pycompat.xrange
Matt Harbison <matt_harbison@yahoo.com>
parents: 39826
diff changeset
  2870
            for i in _xrange(threads):
35599
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2871
                q.put(None)
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2872
            with ready:
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2873
                ready.notify_all()
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2874
            q.join()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2875
30320
c8fa7ad1ff90 perf: add perfbdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30219
diff changeset
  2876
    timer, fm = gettimer(ui, opts)
c8fa7ad1ff90 perf: add perfbdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30219
diff changeset
  2877
    timer(d)
c8fa7ad1ff90 perf: add perfbdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30219
diff changeset
  2878
    fm.end()
c8fa7ad1ff90 perf: add perfbdiff
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30219
diff changeset
  2879
35599
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2880
    if withthreads:
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2881
        done.set()
39827
86dbeb7c9a11 py3: switch contrib/perf from xrange to pycompat.xrange
Matt Harbison <matt_harbison@yahoo.com>
parents: 39826
diff changeset
  2882
        for i in _xrange(threads):
35599
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2883
            q.put(None)
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2884
        with ready:
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2885
            ready.notify_all()
af25237be091 perf: add threading capability to perfbdiff
Boris Feld <boris.feld@octobus.net>
parents: 35137
diff changeset
  2886
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2887
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2888
@command(
49447
3c5d0f879404 perf-unbundle: add a perf command to time the unbundle operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49446
diff changeset
  2889
    b'perf::unbundle',
3c5d0f879404 perf-unbundle: add a perf command to time the unbundle operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49446
diff changeset
  2890
    formatteropts,
3c5d0f879404 perf-unbundle: add a perf command to time the unbundle operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49446
diff changeset
  2891
    b'BUNDLE_FILE',
3c5d0f879404 perf-unbundle: add a perf command to time the unbundle operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49446
diff changeset
  2892
)
3c5d0f879404 perf-unbundle: add a perf command to time the unbundle operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49446
diff changeset
  2893
def perf_unbundle(ui, repo, fname, **opts):
3c5d0f879404 perf-unbundle: add a perf command to time the unbundle operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49446
diff changeset
  2894
    """benchmark application of a bundle in a repository.
3c5d0f879404 perf-unbundle: add a perf command to time the unbundle operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49446
diff changeset
  2895
3c5d0f879404 perf-unbundle: add a perf command to time the unbundle operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49446
diff changeset
  2896
    This does not include the final transaction processing"""
49554
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2897
49447
3c5d0f879404 perf-unbundle: add a perf command to time the unbundle operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49446
diff changeset
  2898
    from mercurial import exchange
3c5d0f879404 perf-unbundle: add a perf command to time the unbundle operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49446
diff changeset
  2899
    from mercurial import bundle2
49554
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2900
    from mercurial import transaction
49447
3c5d0f879404 perf-unbundle: add a perf command to time the unbundle operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49446
diff changeset
  2901
49471
cd21f2b4226f perf: properly process formatter option in perf::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49470
diff changeset
  2902
    opts = _byteskwargs(opts)
cd21f2b4226f perf: properly process formatter option in perf::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49470
diff changeset
  2903
49554
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2904
    ###  some compatibility hotfix
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2905
    #
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2906
    # the data attribute is dropped in 63edc384d3b7 a changeset introducing a
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2907
    # critical regression that break transaction rollback for files that are
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2908
    # de-inlined.
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2909
    method = transaction.transaction._addentry
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2910
    pre_63edc384d3b7 = "data" in getargspec(method).args
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2911
    # the `detailed_exit_code` attribute is introduced in 33c0c25d0b0f
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2912
    # a changeset that is a close descendant of 18415fc918a1, the changeset
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2913
    # that conclude the fix run for the bug introduced in 63edc384d3b7.
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2914
    args = getargspec(error.Abort.__init__).args
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2915
    post_18415fc918a1 = "detailed_exit_code" in args
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2916
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2917
    old_max_inline = None
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2918
    try:
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2919
        if not (pre_63edc384d3b7 or post_18415fc918a1):
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2920
            # disable inlining
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2921
            old_max_inline = mercurial.revlog._maxinline
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2922
            # large enough to never happen
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2923
            mercurial.revlog._maxinline = 2 ** 50
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2924
49553
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2925
        with repo.lock():
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2926
            bundle = [None, None]
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2927
            orig_quiet = repo.ui.quiet
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2928
            try:
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2929
                repo.ui.quiet = True
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2930
                with open(fname, mode="rb") as f:
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2931
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2932
                    def noop_report(*args, **kwargs):
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2933
                        pass
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2934
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2935
                    def setup():
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2936
                        gen, tr = bundle
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2937
                        if tr is not None:
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2938
                            tr.abort()
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2939
                        bundle[:] = [None, None]
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2940
                        f.seek(0)
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2941
                        bundle[0] = exchange.readbundle(ui, f, fname)
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2942
                        bundle[1] = repo.transaction(b'perf::unbundle')
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2943
                        # silence the transaction
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2944
                        bundle[1]._report = noop_report
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2945
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2946
                    def apply():
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2947
                        gen, tr = bundle
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2948
                        bundle2.applybundle(
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2949
                            repo,
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2950
                            gen,
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2951
                            tr,
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2952
                            source=b'perf::unbundle',
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2953
                            url=fname,
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2954
                        )
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2955
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2956
                    timer, fm = gettimer(ui, opts)
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2957
                    timer(apply, setup=setup)
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2958
                    fm.end()
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2959
            finally:
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2960
                repo.ui.quiet == orig_quiet
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2961
                gen, tr = bundle
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2962
                if tr is not None:
220738a53d05 perf-unbundle: pre-indent the main block in per::unbundle
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49489
diff changeset
  2963
                    tr.abort()
49554
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2964
    finally:
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2965
        if old_max_inline is not None:
27bff60887fe perf-unbundle: do a quick and dirty fix to make it run on more commit
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49553
diff changeset
  2966
            mercurial.revlog._maxinline = old_max_inline
49447
3c5d0f879404 perf-unbundle: add a perf command to time the unbundle operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49446
diff changeset
  2967
3c5d0f879404 perf-unbundle: add a perf command to time the unbundle operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49446
diff changeset
  2968
3c5d0f879404 perf-unbundle: add a perf command to time the unbundle operation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49446
diff changeset
  2969
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  2970
    b'perf::unidiff|perfunidiff',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2971
    revlogopts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2972
    + formatteropts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2973
    + [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2974
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2975
            b'',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2976
            b'count',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2977
            1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2978
            b'number of revisions to test (when using --startrev)',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2979
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2980
        (b'', b'alldata', False, b'test unidiffs for all associated revisions'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2981
    ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2982
    b'-c|-m|FILE REV',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  2983
)
35901
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  2984
def perfunidiff(ui, repo, file_, rev=None, count=None, **opts):
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  2985
    """benchmark a unified diff between revisions
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  2986
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  2987
    This doesn't include any copy tracing - it's just a unified diff
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  2988
    of the texts.
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  2989
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  2990
    By default, benchmark a diff between its delta parent and itself.
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  2991
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  2992
    With ``--count``, benchmark diffs between delta parents and self for N
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  2993
    revisions starting at the specified revision.
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  2994
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  2995
    With ``--alldata``, assume the requested revision is a changeset and
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  2996
    measure diffs for all changes related to that changeset (manifest
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  2997
    and filelogs).
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  2998
    """
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  2999
    opts = _byteskwargs(opts)
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3000
    if opts[b'alldata']:
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3001
        opts[b'changelog'] = True
35901
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3002
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3003
    if opts.get(b'changelog') or opts.get(b'manifest'):
35901
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3004
        file_, rev = None, file_
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3005
    elif rev is None:
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3006
        raise error.CommandError(b'perfunidiff', b'invalid arguments')
35901
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3007
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3008
    textpairs = []
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3009
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3010
    r = cmdutil.openrevlog(repo, b'perfunidiff', file_, opts)
35901
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3011
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3012
    startrev = r.rev(r.lookup(rev))
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3013
    for rev in range(startrev, min(startrev + count, len(r) - 1)):
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3014
        if opts[b'alldata']:
35901
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3015
            # Load revisions associated with changeset.
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3016
            ctx = repo[rev]
39346
862d23bc5749 perf: add function for obtaining manifest revision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39345
diff changeset
  3017
            mtext = _manifestrevision(repo, ctx.manifestnode())
35901
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3018
            for pctx in ctx.parents():
39346
862d23bc5749 perf: add function for obtaining manifest revision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39345
diff changeset
  3019
                pman = _manifestrevision(repo, pctx.manifestnode())
35901
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3020
                textpairs.append((pman, mtext))
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3021
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3022
            # Load filelog revisions by iterating manifest delta.
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3023
            man = ctx.manifest()
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3024
            pman = ctx.p1().manifest()
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3025
            for filename, change in pman.diff(man).items():
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3026
                fctx = repo.file(filename)
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3027
                f1 = fctx.revision(change[0][0] or -1)
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3028
                f2 = fctx.revision(change[1][0] or -1)
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3029
                textpairs.append((f1, f2))
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3030
        else:
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3031
            dp = r.deltaparent(rev)
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3032
            textpairs.append((r.revision(dp), r.revision(rev)))
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3033
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3034
    def d():
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3035
        for left, right in textpairs:
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3036
            # The date strings don't matter, so we pass empty strings.
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3037
            headerlines, hunks = mdiff.unidiff(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3038
                left, b'', right, b'', b'left', b'right', binary=False
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3039
            )
35901
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3040
            # consume iterators in roughly the way patch.py does
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3041
            b'\n'.join(headerlines)
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3042
            b''.join(sum((list(hlines) for hrange, hlines in hunks), []))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3043
35901
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3044
    timer, fm = gettimer(ui, opts)
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3045
    timer(d)
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3046
    fm.end()
ed939545edd0 perf: add a perfunidiff command for benchmarking unified diff speed
Augie Fackler <augie@google.com>
parents: 35602
diff changeset
  3047
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3048
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  3049
@command(b'perf::diffwd|perfdiffwd', formatteropts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  3050
def perfdiffwd(ui, repo, **opts):
9826
d768614578dd contrib/perf: profile diff of working directory changes
Patrick Mezard <pmezard@gmail.com>
parents: 9146
diff changeset
  3051
    """Profile diff of working directory changes"""
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  3052
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  3053
    timer, fm = gettimer(ui, opts)
9826
d768614578dd contrib/perf: profile diff of working directory changes
Patrick Mezard <pmezard@gmail.com>
parents: 9146
diff changeset
  3054
    options = {
40214
b456b2e0ad9f py3: make test-contrib-perf.t work on python 3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40145
diff changeset
  3055
        'w': 'ignore_all_space',
b456b2e0ad9f py3: make test-contrib-perf.t work on python 3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40145
diff changeset
  3056
        'b': 'ignore_space_change',
b456b2e0ad9f py3: make test-contrib-perf.t work on python 3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40145
diff changeset
  3057
        'B': 'ignore_blank_lines',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3058
    }
9826
d768614578dd contrib/perf: profile diff of working directory changes
Patrick Mezard <pmezard@gmail.com>
parents: 9146
diff changeset
  3059
40214
b456b2e0ad9f py3: make test-contrib-perf.t work on python 3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40145
diff changeset
  3060
    for diffopt in ('', 'w', 'b', 'B', 'wB'):
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44307
diff changeset
  3061
        opts = {options[c]: b'1' for c in diffopt}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3062
9826
d768614578dd contrib/perf: profile diff of working directory changes
Patrick Mezard <pmezard@gmail.com>
parents: 9146
diff changeset
  3063
        def d():
d768614578dd contrib/perf: profile diff of working directory changes
Patrick Mezard <pmezard@gmail.com>
parents: 9146
diff changeset
  3064
            ui.pushbuffer()
d768614578dd contrib/perf: profile diff of working directory changes
Patrick Mezard <pmezard@gmail.com>
parents: 9146
diff changeset
  3065
            commands.diff(ui, repo, **opts)
d768614578dd contrib/perf: profile diff of working directory changes
Patrick Mezard <pmezard@gmail.com>
parents: 9146
diff changeset
  3066
            ui.popbuffer()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3067
40214
b456b2e0ad9f py3: make test-contrib-perf.t work on python 3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40145
diff changeset
  3068
        diffopt = diffopt.encode('ascii')
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3069
        title = b'diffopts: %s' % (diffopt and (b'-' + diffopt) or b'none')
40718
20d2fd6036ed perf: explicitly pass title as a keyword argument in `perfdiffwd`
Boris Feld <boris.feld@octobus.net>
parents: 40605
diff changeset
  3070
        timer(d, title=title)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  3071
    fm.end()
9826
d768614578dd contrib/perf: profile diff of working directory changes
Patrick Mezard <pmezard@gmail.com>
parents: 9146
diff changeset
  3072
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3073
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  3074
@command(
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  3075
    b'perf::revlogindex|perfrevlogindex',
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  3076
    revlogopts + formatteropts,
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  3077
    b'-c|-m|FILE',
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  3078
)
32565
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3079
def perfrevlogindex(ui, repo, file_=None, **opts):
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3080
    """Benchmark operations against a revlog index.
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3081
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3082
    This tests constructing a revlog instance, reading index data,
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3083
    parsing index data, and performing various operations related to
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3084
    index data.
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3085
    """
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3086
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  3087
    opts = _byteskwargs(opts)
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  3088
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3089
    rl = cmdutil.openrevlog(repo, b'perfrevlogindex', file_, opts)
32565
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3090
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3091
    opener = getattr(rl, 'opener')  # trick linter
47162
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47089
diff changeset
  3092
    # compat with hg <= 5.8
47164
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
  3093
    radix = getattr(rl, 'radix', None)
47162
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47089
diff changeset
  3094
    indexfile = getattr(rl, '_indexfile', None)
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47089
diff changeset
  3095
    if indexfile is None:
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47089
diff changeset
  3096
        # compatibility with <= hg-5.8
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47089
diff changeset
  3097
        indexfile = getattr(rl, 'indexfile')
32565
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3098
    data = opener.read(indexfile)
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3099
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3100
    header = struct.unpack(b'>I', data[0:4])[0]
32565
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3101
    version = header & 0xFFFF
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3102
    if version == 1:
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3103
        inline = header & (1 << 16)
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3104
    else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3105
        raise error.Abort(b'unsupported revlog version: %d' % version)
32565
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3106
47089
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
  3107
    parse_index_v1 = getattr(mercurial.revlog, 'parse_index_v1', None)
47077
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46974
diff changeset
  3108
    if parse_index_v1 is None:
47089
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47077
diff changeset
  3109
        parse_index_v1 = mercurial.revlog.revlogio().parseindex
47077
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46974
diff changeset
  3110
32565
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3111
    rllen = len(rl)
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3112
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3113
    node0 = rl.node(0)
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3114
    node25 = rl.node(rllen // 4)
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3115
    node50 = rl.node(rllen // 2)
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3116
    node75 = rl.node(rllen // 4 * 3)
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3117
    node100 = rl.node(rllen - 1)
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3118
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3119
    allrevs = range(rllen)
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3120
    allrevsrev = list(reversed(allrevs))
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3121
    allnodes = [rl.node(rev) for rev in range(rllen)]
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3122
    allnodesrev = list(reversed(allnodes))
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3123
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3124
    def constructor():
47164
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
  3125
        if radix is not None:
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
  3126
            revlog(opener, radix=radix)
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
  3127
        else:
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
  3128
            # hg <= 5.8
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
  3129
            revlog(opener, indexfile=indexfile)
32565
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3130
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3131
    def read():
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3132
        with opener(indexfile) as fh:
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3133
            fh.read()
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3134
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3135
    def parseindex():
47077
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46974
diff changeset
  3136
        parse_index_v1(data, inline)
32565
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3137
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3138
    def getentry(revornode):
47077
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46974
diff changeset
  3139
        index = parse_index_v1(data, inline)[0]
32565
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3140
        index[revornode]
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3141
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3142
    def getentries(revs, count=1):
47077
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46974
diff changeset
  3143
        index = parse_index_v1(data, inline)[0]
32565
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3144
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3145
        for i in range(count):
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3146
            for rev in revs:
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3147
                index[rev]
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3148
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3149
    def resolvenode(node):
47077
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46974
diff changeset
  3150
        index = parse_index_v1(data, inline)[0]
43620
c314177eb9bb perf: make `perfrevlogindex` use the new `index.rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43619
diff changeset
  3151
        rev = getattr(index, 'rev', None)
c314177eb9bb perf: make `perfrevlogindex` use the new `index.rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43619
diff changeset
  3152
        if rev is None:
47077
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46974
diff changeset
  3153
            nodemap = getattr(parse_index_v1(data, inline)[0], 'nodemap', None)
43620
c314177eb9bb perf: make `perfrevlogindex` use the new `index.rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43619
diff changeset
  3154
            # This only works for the C code.
c314177eb9bb perf: make `perfrevlogindex` use the new `index.rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43619
diff changeset
  3155
            if nodemap is None:
c314177eb9bb perf: make `perfrevlogindex` use the new `index.rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43619
diff changeset
  3156
                return
c314177eb9bb perf: make `perfrevlogindex` use the new `index.rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43619
diff changeset
  3157
            rev = nodemap.__getitem__
32565
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3158
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3159
        try:
43620
c314177eb9bb perf: make `perfrevlogindex` use the new `index.rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43619
diff changeset
  3160
            rev(node)
32565
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3161
        except error.RevlogError:
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3162
            pass
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3163
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3164
    def resolvenodes(nodes, count=1):
47077
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46974
diff changeset
  3165
        index = parse_index_v1(data, inline)[0]
43620
c314177eb9bb perf: make `perfrevlogindex` use the new `index.rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43619
diff changeset
  3166
        rev = getattr(index, 'rev', None)
c314177eb9bb perf: make `perfrevlogindex` use the new `index.rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43619
diff changeset
  3167
        if rev is None:
47077
5e64c93d5f94 revlog: remove the revlogio class
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46974
diff changeset
  3168
            nodemap = getattr(parse_index_v1(data, inline)[0], 'nodemap', None)
43620
c314177eb9bb perf: make `perfrevlogindex` use the new `index.rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43619
diff changeset
  3169
            # This only works for the C code.
c314177eb9bb perf: make `perfrevlogindex` use the new `index.rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43619
diff changeset
  3170
            if nodemap is None:
c314177eb9bb perf: make `perfrevlogindex` use the new `index.rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43619
diff changeset
  3171
                return
c314177eb9bb perf: make `perfrevlogindex` use the new `index.rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43619
diff changeset
  3172
            rev = nodemap.__getitem__
32565
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3173
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3174
        for i in range(count):
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3175
            for node in nodes:
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3176
                try:
43620
c314177eb9bb perf: make `perfrevlogindex` use the new `index.rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43619
diff changeset
  3177
                    rev(node)
32565
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3178
                except error.RevlogError:
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3179
                    pass
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3180
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3181
    benches = [
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3182
        (constructor, b'revlog constructor'),
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3183
        (read, b'read'),
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3184
        (parseindex, b'create index object'),
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3185
        (lambda: getentry(0), b'retrieve index entry for rev 0'),
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3186
        (lambda: resolvenode(b'a' * 20), b'look up missing node'),
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3187
        (lambda: resolvenode(node0), b'look up node at rev 0'),
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3188
        (lambda: resolvenode(node25), b'look up node at 1/4 len'),
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3189
        (lambda: resolvenode(node50), b'look up node at 1/2 len'),
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3190
        (lambda: resolvenode(node75), b'look up node at 3/4 len'),
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3191
        (lambda: resolvenode(node100), b'look up node at tip'),
32565
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3192
        # 2x variation is to measure caching impact.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3193
        (lambda: resolvenodes(allnodes), b'look up all nodes (forward)'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3194
        (lambda: resolvenodes(allnodes, 2), b'look up all nodes 2x (forward)'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3195
        (lambda: resolvenodes(allnodesrev), b'look up all nodes (reverse)'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3196
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3197
            lambda: resolvenodes(allnodesrev, 2),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3198
            b'look up all nodes 2x (reverse)',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3199
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3200
        (lambda: getentries(allrevs), b'retrieve all index entries (forward)'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3201
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3202
            lambda: getentries(allrevs, 2),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3203
            b'retrieve all index entries 2x (forward)',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3204
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3205
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3206
            lambda: getentries(allrevsrev),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3207
            b'retrieve all index entries (reverse)',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3208
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3209
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3210
            lambda: getentries(allrevsrev, 2),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3211
            b'retrieve all index entries 2x (reverse)',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3212
        ),
32565
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3213
    ]
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3214
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3215
    for fn, title in benches:
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3216
        timer, fm = gettimer(ui, opts)
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3217
        timer(fn, title=title)
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3218
        fm.end()
e4f514627514 perf: benchmark command for revlog indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32564
diff changeset
  3219
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3220
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3221
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  3222
    b'perf::revlogrevisions|perfrevlogrevisions',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3223
    revlogopts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3224
    + formatteropts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3225
    + [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3226
        (b'd', b'dist', 100, b'distance between the revisions'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3227
        (b's', b'startrev', 0, b'revision to start reading at'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3228
        (b'', b'reverse', False, b'read in reverse'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3229
    ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3230
    b'-c|-m|FILE',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3231
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3232
def perfrevlogrevisions(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3233
    ui, repo, file_=None, startrev=0, reverse=False, **opts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3234
):
27492
ac549d7fbc2b perf: use standard arguments for perfrevlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27472
diff changeset
  3235
    """Benchmark reading a series of revisions from a revlog.
ac549d7fbc2b perf: use standard arguments for perfrevlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27472
diff changeset
  3236
ac549d7fbc2b perf: use standard arguments for perfrevlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27472
diff changeset
  3237
    By default, we read every ``-d/--dist`` revision from 0 to tip of
ac549d7fbc2b perf: use standard arguments for perfrevlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27472
diff changeset
  3238
    the specified revlog.
27493
14b0930105da perf: make start revision configurable for perfrevlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27492
diff changeset
  3239
14b0930105da perf: make start revision configurable for perfrevlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27492
diff changeset
  3240
    The start revision can be defined via ``-s/--startrev``.
27492
ac549d7fbc2b perf: use standard arguments for perfrevlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27472
diff changeset
  3241
    """
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  3242
    opts = _byteskwargs(opts)
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  3243
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3244
    rl = cmdutil.openrevlog(repo, b'perfrevlogrevisions', file_, opts)
32272
4c6b2076d292 perf: move revlog construction and length calculation out of benchmark
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32271
diff changeset
  3245
    rllen = getlen(ui)(rl)
30019
973cf6c3de30 perf: add --reverse to perfrevlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29567
diff changeset
  3246
40143
d5d28d360a19 pref: support negative indexing in perfrevlogrevisions
Boris Feld <boris.feld@octobus.net>
parents: 40142
diff changeset
  3247
    if startrev < 0:
d5d28d360a19 pref: support negative indexing in perfrevlogrevisions
Boris Feld <boris.feld@octobus.net>
parents: 40142
diff changeset
  3248
        startrev = rllen + startrev
d5d28d360a19 pref: support negative indexing in perfrevlogrevisions
Boris Feld <boris.feld@octobus.net>
parents: 40142
diff changeset
  3249
11694
bf49d48e4602 perf: add perfrevlog function to check performance of revlog
Pradeepkumar Gayam <in3xes@gmail.com>
parents: 10493
diff changeset
  3250
    def d():
32272
4c6b2076d292 perf: move revlog construction and length calculation out of benchmark
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32271
diff changeset
  3251
        rl.clearcaches()
30019
973cf6c3de30 perf: add --reverse to perfrevlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29567
diff changeset
  3252
32264
6b582f9b6e5e perf: don't clobber startrev variable
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32246
diff changeset
  3253
        beginrev = startrev
32272
4c6b2076d292 perf: move revlog construction and length calculation out of benchmark
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32271
diff changeset
  3254
        endrev = rllen
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3255
        dist = opts[b'dist']
30019
973cf6c3de30 perf: add --reverse to perfrevlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29567
diff changeset
  3256
973cf6c3de30 perf: add --reverse to perfrevlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29567
diff changeset
  3257
        if reverse:
40587
cbd251d479bb perf: fix perfrevlogrevisions --reverse
Boris Feld <boris.feld@octobus.net>
parents: 40581
diff changeset
  3258
            beginrev, endrev = endrev - 1, beginrev - 1
30019
973cf6c3de30 perf: add --reverse to perfrevlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29567
diff changeset
  3259
            dist = -1 * dist
973cf6c3de30 perf: add --reverse to perfrevlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29567
diff changeset
  3260
39827
86dbeb7c9a11 py3: switch contrib/perf from xrange to pycompat.xrange
Matt Harbison <matt_harbison@yahoo.com>
parents: 39826
diff changeset
  3261
        for x in _xrange(beginrev, endrev, dist):
32337
d7efaf6275a7 perf: always pass node to revlog.revision()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32272
diff changeset
  3262
            # Old revisions don't support passing int.
d7efaf6275a7 perf: always pass node to revlog.revision()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32272
diff changeset
  3263
            n = rl.node(x)
d7efaf6275a7 perf: always pass node to revlog.revision()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32272
diff changeset
  3264
            rl.revision(n)
11694
bf49d48e4602 perf: add perfrevlog function to check performance of revlog
Pradeepkumar Gayam <in3xes@gmail.com>
parents: 10493
diff changeset
  3265
32265
c68c400d0a2d perf: move gettimer() call
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32264
diff changeset
  3266
    timer, fm = gettimer(ui, opts)
11694
bf49d48e4602 perf: add perfrevlog function to check performance of revlog
Pradeepkumar Gayam <in3xes@gmail.com>
parents: 10493
diff changeset
  3267
    timer(d)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  3268
    fm.end()
11694
bf49d48e4602 perf: add perfrevlog function to check performance of revlog
Pradeepkumar Gayam <in3xes@gmail.com>
parents: 10493
diff changeset
  3269
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3270
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3271
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  3272
    b'perf::revlogwrite|perfrevlogwrite',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3273
    revlogopts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3274
    + formatteropts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3275
    + [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3276
        (b's', b'startrev', 1000, b'revision to start writing at'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3277
        (b'', b'stoprev', -1, b'last revision to write'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3278
        (b'', b'count', 3, b'number of passes to perform'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3279
        (b'', b'details', False, b'print timing for every revisions tested'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3280
        (b'', b'source', b'full', b'the kind of data feed in the revlog'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3281
        (b'', b'lazydeltabase', True, b'try the provided delta first'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3282
        (b'', b'clear-caches', True, b'clear revlog cache between calls'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3283
    ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3284
    b'-c|-m|FILE',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3285
)
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3286
def perfrevlogwrite(ui, repo, file_=None, startrev=1000, stoprev=-1, **opts):
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3287
    """Benchmark writing a series of revisions to a revlog.
40600
631011ff6771 perf: add the notion of "source" to perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40599
diff changeset
  3288
631011ff6771 perf: add the notion of "source" to perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40599
diff changeset
  3289
    Possible source values are:
631011ff6771 perf: add the notion of "source" to perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40599
diff changeset
  3290
    * `full`: add from a full text (default).
40601
6c2357029364 perf: add `parent-1` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40600
diff changeset
  3291
    * `parent-1`: add from a delta to the first parent
40602
b5b3dd4e40c3 perf: add `parent-2` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40601
diff changeset
  3292
    * `parent-2`: add from a delta to the second parent if it exists
b5b3dd4e40c3 perf: add `parent-2` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40601
diff changeset
  3293
                  (use a delta from the first parent otherwise)
40603
e14d44772fb3 perf: add `parent-smallest` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40602
diff changeset
  3294
    * `parent-smallest`: add from the smallest delta (either p1 or p2)
40604
355ae096faef perf: add `storage` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40603
diff changeset
  3295
    * `storage`: add from the existing precomputed deltas
42477
74e2f4b609f6 perf: clarify some of the custom behavior of `perfrevlogwrite`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42476
diff changeset
  3296
74e2f4b609f6 perf: clarify some of the custom behavior of `perfrevlogwrite`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42476
diff changeset
  3297
    Note: This performance command measures performance in a custom way. As a
74e2f4b609f6 perf: clarify some of the custom behavior of `perfrevlogwrite`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42476
diff changeset
  3298
    result some of the global configuration of the 'perf' command does not
74e2f4b609f6 perf: clarify some of the custom behavior of `perfrevlogwrite`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42476
diff changeset
  3299
    apply to it:
74e2f4b609f6 perf: clarify some of the custom behavior of `perfrevlogwrite`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42476
diff changeset
  3300
74e2f4b609f6 perf: clarify some of the custom behavior of `perfrevlogwrite`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42476
diff changeset
  3301
    * ``pre-run``: disabled
74e2f4b609f6 perf: clarify some of the custom behavior of `perfrevlogwrite`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42476
diff changeset
  3302
74e2f4b609f6 perf: clarify some of the custom behavior of `perfrevlogwrite`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42476
diff changeset
  3303
    * ``profile-benchmark``: disabled
74e2f4b609f6 perf: clarify some of the custom behavior of `perfrevlogwrite`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42476
diff changeset
  3304
74e2f4b609f6 perf: clarify some of the custom behavior of `perfrevlogwrite`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42476
diff changeset
  3305
    * ``run-limits``: disabled use --count instead
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3306
    """
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3307
    opts = _byteskwargs(opts)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3308
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3309
    rl = cmdutil.openrevlog(repo, b'perfrevlogwrite', file_, opts)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3310
    rllen = getlen(ui)(rl)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3311
    if startrev < 0:
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3312
        startrev = rllen + startrev
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3313
    if stoprev < 0:
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3314
        stoprev = rllen + stoprev
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3315
40605
4756a33d0d31 perf: add a lazydeltabase option to perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40604
diff changeset
  3316
    lazydeltabase = opts['lazydeltabase']
40600
631011ff6771 perf: add the notion of "source" to perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40599
diff changeset
  3317
    source = opts['source']
41012
e88ced97151d perfrevlogwrite: fix a typo in the option name
Boris Feld <boris.feld@octobus.net>
parents: 40990
diff changeset
  3318
    clearcaches = opts['clear_caches']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3319
    validsource = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3320
        b'full',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3321
        b'parent-1',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3322
        b'parent-2',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3323
        b'parent-smallest',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3324
        b'storage',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3325
    )
40600
631011ff6771 perf: add the notion of "source" to perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40599
diff changeset
  3326
    if source not in validsource:
631011ff6771 perf: add the notion of "source" to perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40599
diff changeset
  3327
        raise error.Abort('invalid source type: %s' % source)
631011ff6771 perf: add the notion of "source" to perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40599
diff changeset
  3328
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3329
    ### actually gather results
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3330
    count = opts['count']
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3331
    if count <= 0:
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3332
        raise error.Abort('invalide run count: %d' % count)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3333
    allresults = []
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3334
    for c in range(count):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3335
        timing = _timeonewrite(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3336
            ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3337
            rl,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3338
            source,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3339
            startrev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3340
            stoprev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3341
            c + 1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3342
            lazydeltabase=lazydeltabase,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3343
            clearcaches=clearcaches,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3344
        )
40600
631011ff6771 perf: add the notion of "source" to perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40599
diff changeset
  3345
        allresults.append(timing)
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3346
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3347
    ### consolidate the results in a single list
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3348
    results = []
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3349
    for idx, (rev, t) in enumerate(allresults[0]):
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3350
        ts = [t]
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3351
        for other in allresults[1:]:
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3352
            orev, ot = other[idx]
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3353
            assert orev == rev
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3354
            ts.append(ot)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3355
        results.append((rev, ts))
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3356
    resultcount = len(results)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3357
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3358
    ### Compute and display relevant statistics
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3359
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3360
    # get a formatter
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3361
    fm = ui.formatter(b'perf', opts)
50839
cf0502231d56 perf: display all timing by default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50832
diff changeset
  3362
    displayall = ui.configbool(b"perf", b"all-timing", True)
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3363
40598
4dd7edeb3da9 perf: offer full details in perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40597
diff changeset
  3364
    # print individual details if requested
4dd7edeb3da9 perf: offer full details in perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40597
diff changeset
  3365
    if opts['details']:
4dd7edeb3da9 perf: offer full details in perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40597
diff changeset
  3366
        for idx, item in enumerate(results, 1):
4dd7edeb3da9 perf: offer full details in perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40597
diff changeset
  3367
            rev, data = item
4dd7edeb3da9 perf: offer full details in perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40597
diff changeset
  3368
            title = 'revisions #%d of %d, rev %d' % (idx, resultcount, rev)
4dd7edeb3da9 perf: offer full details in perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40597
diff changeset
  3369
            formatone(fm, data, title=title, displayall=displayall)
4dd7edeb3da9 perf: offer full details in perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40597
diff changeset
  3370
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3371
    # sorts results by median time
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3372
    results.sort(key=lambda x: sorted(x[1])[len(x[1]) // 2])
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3373
    # list of (name, index) to display)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3374
    relevants = [
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3375
        ("min", 0),
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3376
        ("10%", resultcount * 10 // 100),
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3377
        ("25%", resultcount * 25 // 100),
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3378
        ("50%", resultcount * 70 // 100),
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3379
        ("75%", resultcount * 75 // 100),
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3380
        ("90%", resultcount * 90 // 100),
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3381
        ("95%", resultcount * 95 // 100),
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3382
        ("99%", resultcount * 99 // 100),
40969
74ee5ff1e81c perf: report more of the higher range in perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40961
diff changeset
  3383
        ("99.9%", resultcount * 999 // 1000),
74ee5ff1e81c perf: report more of the higher range in perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40961
diff changeset
  3384
        ("99.99%", resultcount * 9999 // 10000),
74ee5ff1e81c perf: report more of the higher range in perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40961
diff changeset
  3385
        ("99.999%", resultcount * 99999 // 100000),
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3386
        ("max", -1),
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3387
    ]
40599
c63081cd3902 perf: only display the total time for perfrevlogwrite if quiet
Boris Feld <boris.feld@octobus.net>
parents: 40598
diff changeset
  3388
    if not ui.quiet:
c63081cd3902 perf: only display the total time for perfrevlogwrite if quiet
Boris Feld <boris.feld@octobus.net>
parents: 40598
diff changeset
  3389
        for name, idx in relevants:
c63081cd3902 perf: only display the total time for perfrevlogwrite if quiet
Boris Feld <boris.feld@octobus.net>
parents: 40598
diff changeset
  3390
            data = results[idx]
c63081cd3902 perf: only display the total time for perfrevlogwrite if quiet
Boris Feld <boris.feld@octobus.net>
parents: 40598
diff changeset
  3391
            title = '%s of %d, rev %d' % (name, resultcount, data[0])
c63081cd3902 perf: only display the total time for perfrevlogwrite if quiet
Boris Feld <boris.feld@octobus.net>
parents: 40598
diff changeset
  3392
            formatone(fm, data[1], title=title, displayall=displayall)
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3393
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3394
    # XXX summing that many float will not be very precise, we ignore this fact
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3395
    # for now
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3396
    totaltime = []
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3397
    for item in allresults:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3398
        totaltime.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3399
            (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3400
                sum(x[1][0] for x in item),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3401
                sum(x[1][1] for x in item),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3402
                sum(x[1][2] for x in item),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3403
            )
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3404
        )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3405
    formatone(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3406
        fm,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3407
        totaltime,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3408
        title="total time (%d revs)" % resultcount,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3409
        displayall=displayall,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3410
    )
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3411
    fm.end()
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3412
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3413
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
  3414
class _faketr:
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3415
    def add(s, x, y, z=None):
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3416
        return None
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3417
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3418
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3419
def _timeonewrite(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3420
    ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3421
    orig,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3422
    source,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3423
    startrev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3424
    stoprev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3425
    runidx=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3426
    lazydeltabase=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3427
    clearcaches=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3428
):
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3429
    timings = []
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3430
    tr = _faketr()
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3431
    with _temprevlog(ui, orig, startrev) as dest:
40605
4756a33d0d31 perf: add a lazydeltabase option to perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40604
diff changeset
  3432
        dest._lazydeltabase = lazydeltabase
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3433
        revs = list(orig.revs(startrev, stoprev))
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3434
        total = len(revs)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3435
        topic = 'adding'
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3436
        if runidx is not None:
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3437
            topic += ' (run #%d)' % runidx
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3438
        # Support both old and new progress API
41156
f36fd52dae8f perfrevlogwrite: use progress helper on modern hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 41012
diff changeset
  3439
        if util.safehasattr(ui, 'makeprogress'):
f36fd52dae8f perfrevlogwrite: use progress helper on modern hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 41012
diff changeset
  3440
            progress = ui.makeprogress(topic, unit='revs', total=total)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3441
41156
f36fd52dae8f perfrevlogwrite: use progress helper on modern hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 41012
diff changeset
  3442
            def updateprogress(pos):
f36fd52dae8f perfrevlogwrite: use progress helper on modern hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 41012
diff changeset
  3443
                progress.update(pos)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3444
41156
f36fd52dae8f perfrevlogwrite: use progress helper on modern hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 41012
diff changeset
  3445
            def completeprogress():
f36fd52dae8f perfrevlogwrite: use progress helper on modern hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 41012
diff changeset
  3446
                progress.complete()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3447
41156
f36fd52dae8f perfrevlogwrite: use progress helper on modern hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 41012
diff changeset
  3448
        else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3449
41156
f36fd52dae8f perfrevlogwrite: use progress helper on modern hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 41012
diff changeset
  3450
            def updateprogress(pos):
f36fd52dae8f perfrevlogwrite: use progress helper on modern hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 41012
diff changeset
  3451
                ui.progress(topic, pos, unit='revs', total=total)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3452
41156
f36fd52dae8f perfrevlogwrite: use progress helper on modern hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 41012
diff changeset
  3453
            def completeprogress():
f36fd52dae8f perfrevlogwrite: use progress helper on modern hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 41012
diff changeset
  3454
                ui.progress(topic, None, unit='revs', total=total)
f36fd52dae8f perfrevlogwrite: use progress helper on modern hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 41012
diff changeset
  3455
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3456
        for idx, rev in enumerate(revs):
41156
f36fd52dae8f perfrevlogwrite: use progress helper on modern hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 41012
diff changeset
  3457
            updateprogress(idx)
40600
631011ff6771 perf: add the notion of "source" to perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40599
diff changeset
  3458
            addargs, addkwargs = _getrevisionseed(orig, rev, tr, source)
40990
21a9cace4bbf perfrevflogwrite: clear revlog cache between each write
Boris Feld <boris.feld@octobus.net>
parents: 40969
diff changeset
  3459
            if clearcaches:
21a9cace4bbf perfrevflogwrite: clear revlog cache between each write
Boris Feld <boris.feld@octobus.net>
parents: 40969
diff changeset
  3460
                dest.index.clearcaches()
21a9cace4bbf perfrevflogwrite: clear revlog cache between each write
Boris Feld <boris.feld@octobus.net>
parents: 40969
diff changeset
  3461
                dest.clearcaches()
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3462
            with timeone() as r:
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3463
                dest.addrawrevision(*addargs, **addkwargs)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3464
            timings.append((rev, r[0]))
41156
f36fd52dae8f perfrevlogwrite: use progress helper on modern hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 41012
diff changeset
  3465
        updateprogress(total)
f36fd52dae8f perfrevlogwrite: use progress helper on modern hg
Martin von Zweigbergk <martinvonz@google.com>
parents: 41012
diff changeset
  3466
        completeprogress()
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3467
    return timings
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3468
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3469
40600
631011ff6771 perf: add the notion of "source" to perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40599
diff changeset
  3470
def _getrevisionseed(orig, rev, tr, source):
40602
b5b3dd4e40c3 perf: add `parent-2` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40601
diff changeset
  3471
    from mercurial.node import nullid
b5b3dd4e40c3 perf: add `parent-2` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40601
diff changeset
  3472
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3473
    linkrev = orig.linkrev(rev)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3474
    node = orig.node(rev)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3475
    p1, p2 = orig.parents(node)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3476
    flags = orig.flags(rev)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3477
    cachedelta = None
40600
631011ff6771 perf: add the notion of "source" to perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40599
diff changeset
  3478
    text = None
631011ff6771 perf: add the notion of "source" to perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40599
diff changeset
  3479
631011ff6771 perf: add the notion of "source" to perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40599
diff changeset
  3480
    if source == b'full':
631011ff6771 perf: add the notion of "source" to perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40599
diff changeset
  3481
        text = orig.revision(rev)
40601
6c2357029364 perf: add `parent-1` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40600
diff changeset
  3482
    elif source == b'parent-1':
6c2357029364 perf: add `parent-1` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40600
diff changeset
  3483
        baserev = orig.rev(p1)
6c2357029364 perf: add `parent-1` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40600
diff changeset
  3484
        cachedelta = (baserev, orig.revdiff(p1, rev))
40602
b5b3dd4e40c3 perf: add `parent-2` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40601
diff changeset
  3485
    elif source == b'parent-2':
b5b3dd4e40c3 perf: add `parent-2` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40601
diff changeset
  3486
        parent = p2
b5b3dd4e40c3 perf: add `parent-2` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40601
diff changeset
  3487
        if p2 == nullid:
b5b3dd4e40c3 perf: add `parent-2` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40601
diff changeset
  3488
            parent = p1
b5b3dd4e40c3 perf: add `parent-2` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40601
diff changeset
  3489
        baserev = orig.rev(parent)
b5b3dd4e40c3 perf: add `parent-2` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40601
diff changeset
  3490
        cachedelta = (baserev, orig.revdiff(parent, rev))
40603
e14d44772fb3 perf: add `parent-smallest` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40602
diff changeset
  3491
    elif source == b'parent-smallest':
e14d44772fb3 perf: add `parent-smallest` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40602
diff changeset
  3492
        p1diff = orig.revdiff(p1, rev)
e14d44772fb3 perf: add `parent-smallest` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40602
diff changeset
  3493
        parent = p1
e14d44772fb3 perf: add `parent-smallest` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40602
diff changeset
  3494
        diff = p1diff
e14d44772fb3 perf: add `parent-smallest` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40602
diff changeset
  3495
        if p2 != nullid:
e14d44772fb3 perf: add `parent-smallest` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40602
diff changeset
  3496
            p2diff = orig.revdiff(p2, rev)
e14d44772fb3 perf: add `parent-smallest` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40602
diff changeset
  3497
            if len(p1diff) > len(p2diff):
e14d44772fb3 perf: add `parent-smallest` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40602
diff changeset
  3498
                parent = p2
e14d44772fb3 perf: add `parent-smallest` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40602
diff changeset
  3499
                diff = p2diff
e14d44772fb3 perf: add `parent-smallest` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40602
diff changeset
  3500
        baserev = orig.rev(parent)
e14d44772fb3 perf: add `parent-smallest` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40602
diff changeset
  3501
        cachedelta = (baserev, diff)
40604
355ae096faef perf: add `storage` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40603
diff changeset
  3502
    elif source == b'storage':
355ae096faef perf: add `storage` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40603
diff changeset
  3503
        baserev = orig.deltaparent(rev)
355ae096faef perf: add `storage` as possible source for perfrevlogwrite
Boris Feld <boris.feld@octobus.net>
parents: 40603
diff changeset
  3504
        cachedelta = (baserev, orig.revdiff(orig.node(baserev), rev))
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3505
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3506
    return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3507
        (text, tr, linkrev, p1, p2),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3508
        {'node': node, 'flags': flags, 'cachedelta': cachedelta},
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3509
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3510
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3511
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3512
@contextlib.contextmanager
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3513
def _temprevlog(ui, orig, truncaterev):
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3514
    from mercurial import vfs as vfsmod
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3515
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3516
    if orig._inline:
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3517
        raise error.Abort('not supporting inline revlog (yet)')
42478
bc4373babd04 revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42477
diff changeset
  3518
    revlogkwargs = {}
bc4373babd04 revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42477
diff changeset
  3519
    k = 'upperboundcomp'
bc4373babd04 revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42477
diff changeset
  3520
    if util.safehasattr(orig, k):
bc4373babd04 revlog: add the option to track the expected compression upper bound
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42477
diff changeset
  3521
        revlogkwargs[k] = getattr(orig, k)
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3522
47162
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47089
diff changeset
  3523
    indexfile = getattr(orig, '_indexfile', None)
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47089
diff changeset
  3524
    if indexfile is None:
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47089
diff changeset
  3525
        # compatibility with <= hg-5.8
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47089
diff changeset
  3526
        indexfile = getattr(orig, 'indexfile')
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47089
diff changeset
  3527
    origindexpath = orig.opener.join(indexfile)
47163
396442cd7e6a revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47162
diff changeset
  3528
396442cd7e6a revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47162
diff changeset
  3529
    datafile = getattr(orig, '_datafile', getattr(orig, 'datafile'))
396442cd7e6a revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47162
diff changeset
  3530
    origdatapath = orig.opener.join(datafile)
47164
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
  3531
    radix = b'revlog'
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
  3532
    indexname = b'revlog.i'
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
  3533
    dataname = b'revlog.d'
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3534
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3535
    tmpdir = tempfile.mkdtemp(prefix='tmp-hgperf-')
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3536
    try:
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3537
        # copy the data file in a temporary directory
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3538
        ui.debug('copying data in %s\n' % tmpdir)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3539
        destindexpath = os.path.join(tmpdir, 'revlog.i')
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3540
        destdatapath = os.path.join(tmpdir, 'revlog.d')
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3541
        shutil.copyfile(origindexpath, destindexpath)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3542
        shutil.copyfile(origdatapath, destdatapath)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3543
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3544
        # remove the data we want to add again
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3545
        ui.debug('truncating data to be rewritten\n')
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3546
        with open(destindexpath, 'ab') as index:
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3547
            index.seek(0)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3548
            index.truncate(truncaterev * orig._io.size)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3549
        with open(destdatapath, 'ab') as data:
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3550
            data.seek(0)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3551
            data.truncate(orig.start(truncaterev))
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3552
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3553
        # instantiate a new revlog from the temporary copy
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3554
        ui.debug('truncating adding to be rewritten\n')
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3555
        vfs = vfsmod.vfs(tmpdir)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3556
        vfs.options = getattr(orig.opener, 'options', None)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3557
47164
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
  3558
        try:
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
  3559
            dest = revlog(vfs, radix=radix, **revlogkwargs)
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
  3560
        except TypeError:
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
  3561
            dest = revlog(
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
  3562
                vfs, indexfile=indexname, datafile=dataname, **revlogkwargs
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47163
diff changeset
  3563
            )
40597
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3564
        if dest._inline:
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3565
            raise error.Abort('not supporting inline revlog (yet)')
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3566
        # make sure internals are initialized
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3567
        dest.revision(len(dest) - 1)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3568
        yield dest
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3569
        del dest, vfs
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3570
    finally:
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3571
        shutil.rmtree(tmpdir, True)
164b2e77f9a5 perf: introduce a perfrevlogwrite command
Boris Feld <boris.feld@octobus.net>
parents: 40587
diff changeset
  3572
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3573
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3574
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  3575
    b'perf::revlogchunks|perfrevlogchunks',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3576
    revlogopts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3577
    + formatteropts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3578
    + [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3579
        (b'e', b'engines', b'', b'compression engines to use'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3580
        (b's', b'startrev', 0, b'revision to start at'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3581
    ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3582
    b'-c|-m|FILE',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3583
)
30796
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3584
def perfrevlogchunks(ui, repo, file_=None, engines=None, startrev=0, **opts):
30460
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3585
    """Benchmark operations on revlog chunks.
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3586
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3587
    Logically, each revlog is a collection of fulltext revisions. However,
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3588
    stored within each revlog are "chunks" of possibly compressed data. This
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3589
    data needs to be read and decompressed or compressed and written.
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3590
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3591
    This command measures the time it takes to read+decompress and recompress
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3592
    chunks in a revlog. It effectively isolates I/O and compression performance.
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3593
    For measurements of higher-level operations like resolving revisions,
32564
7236facefd4f perf: rename perfrevlog to perfrevlogrevisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32501
diff changeset
  3594
    see ``perfrevlogrevisions`` and ``perfrevlogrevision``.
30460
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3595
    """
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  3596
    opts = _byteskwargs(opts)
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  3597
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3598
    rl = cmdutil.openrevlog(repo, b'perfrevlogchunks', file_, opts)
32269
75e93d95aae6 revlog: rename _chunkraw to _getsegmentforrevs()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32268
diff changeset
  3599
75e93d95aae6 revlog: rename _chunkraw to _getsegmentforrevs()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32268
diff changeset
  3600
    # _chunkraw was renamed to _getsegmentforrevs.
75e93d95aae6 revlog: rename _chunkraw to _getsegmentforrevs()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32268
diff changeset
  3601
    try:
75e93d95aae6 revlog: rename _chunkraw to _getsegmentforrevs()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32268
diff changeset
  3602
        segmentforrevs = rl._getsegmentforrevs
75e93d95aae6 revlog: rename _chunkraw to _getsegmentforrevs()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32268
diff changeset
  3603
    except AttributeError:
75e93d95aae6 revlog: rename _chunkraw to _getsegmentforrevs()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32268
diff changeset
  3604
        segmentforrevs = rl._chunkraw
30796
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3605
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3606
    # Verify engines argument.
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3607
    if engines:
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44307
diff changeset
  3608
        engines = {e.strip() for e in engines.split(b',')}
30796
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3609
        for engine in engines:
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3610
            try:
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3611
                util.compressionengines[engine]
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3612
            except KeyError:
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3613
                raise error.Abort(b'unknown compression engine: %s' % engine)
30796
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3614
    else:
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3615
        engines = []
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3616
        for e in util.compengines:
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3617
            engine = util.compengines[e]
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3618
            try:
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3619
                if engine.available():
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3620
                    engine.revlogcompressor().compress(b'dummy')
30796
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3621
                    engines.append(e)
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3622
            except NotImplementedError:
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3623
                pass
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3624
30460
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3625
    revs = list(rl.revs(startrev, len(rl) - 1))
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3626
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3627
    def rlfh(rl):
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3628
        if rl._inline:
47162
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47089
diff changeset
  3629
            indexfile = getattr(rl, '_indexfile', None)
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47089
diff changeset
  3630
            if indexfile is None:
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47089
diff changeset
  3631
                # compatibility with <= hg-5.8
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47089
diff changeset
  3632
                indexfile = getattr(rl, 'indexfile')
a07d5cb03a85 revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47089
diff changeset
  3633
            return getsvfs(repo)(indexfile)
30460
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3634
        else:
47163
396442cd7e6a revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47162
diff changeset
  3635
            datafile = getattr(rl, 'datafile', getattr(rl, 'datafile'))
396442cd7e6a revlog: rename `datafile` to `datafile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47162
diff changeset
  3636
            return getsvfs(repo)(datafile)
30460
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3637
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3638
    def doread():
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3639
        rl.clearcaches()
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3640
        for rev in revs:
32268
112ba1c7d65d perf: store reference to revlog._chunkraw in a local variable
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32265
diff changeset
  3641
            segmentforrevs(rev, rev)
30460
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3642
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3643
    def doreadcachedfh():
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3644
        rl.clearcaches()
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3645
        fh = rlfh(rl)
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3646
        for rev in revs:
32268
112ba1c7d65d perf: store reference to revlog._chunkraw in a local variable
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32265
diff changeset
  3647
            segmentforrevs(rev, rev, df=fh)
30460
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3648
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3649
    def doreadbatch():
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3650
        rl.clearcaches()
32268
112ba1c7d65d perf: store reference to revlog._chunkraw in a local variable
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32265
diff changeset
  3651
        segmentforrevs(revs[0], revs[-1])
30460
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3652
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3653
    def doreadbatchcachedfh():
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3654
        rl.clearcaches()
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3655
        fh = rlfh(rl)
32268
112ba1c7d65d perf: store reference to revlog._chunkraw in a local variable
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32265
diff changeset
  3656
        segmentforrevs(revs[0], revs[-1], df=fh)
30460
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3657
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3658
    def dochunk():
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3659
        rl.clearcaches()
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3660
        fh = rlfh(rl)
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3661
        for rev in revs:
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3662
            rl._chunk(rev, df=fh)
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3663
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3664
    chunks = [None]
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3665
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3666
    def dochunkbatch():
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3667
        rl.clearcaches()
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3668
        fh = rlfh(rl)
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3669
        # Save chunks as a side-effect.
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3670
        chunks[0] = rl._chunks(revs, df=fh)
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3671
30796
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3672
    def docompress(compressor):
30460
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3673
        rl.clearcaches()
30796
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3674
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3675
        try:
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3676
            # Swap in the requested compression engine.
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3677
            oldcompressor = rl._compressor
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3678
            rl._compressor = compressor
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3679
            for chunk in chunks[0]:
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3680
                rl.compress(chunk)
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3681
        finally:
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3682
            rl._compressor = oldcompressor
30460
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3683
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3684
    benches = [
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3685
        (lambda: doread(), b'read'),
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3686
        (lambda: doreadcachedfh(), b'read w/ reused fd'),
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3687
        (lambda: doreadbatch(), b'read batch'),
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3688
        (lambda: doreadbatchcachedfh(), b'read batch w/ reused fd'),
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3689
        (lambda: dochunk(), b'chunk'),
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3690
        (lambda: dochunkbatch(), b'chunk batch'),
30460
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3691
    ]
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3692
30796
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3693
    for engine in sorted(engines):
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3694
        compressor = util.compengines[engine].revlogcompressor()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3695
        benches.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3696
            (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3697
                functools.partial(docompress, compressor),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3698
                b'compress w/ %s' % engine,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3699
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3700
        )
30796
168ef0a4eb3b perf: support multiple compression engines in perfrevlogchunks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30793
diff changeset
  3701
30460
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3702
    for fn, title in benches:
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3703
        timer, fm = gettimer(ui, opts)
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3704
        timer(fn, title=title)
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3705
        fm.end()
94ca0e13d1fc perf: add command for measuring revlog chunk operations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30435
diff changeset
  3706
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3707
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3708
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  3709
    b'perf::revlogrevision|perfrevlogrevision',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3710
    revlogopts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3711
    + formatteropts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3712
    + [(b'', b'cache', False, b'use caches instead of clearing')],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3713
    b'-c|-m|FILE REV',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3714
)
27470
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3715
def perfrevlogrevision(ui, repo, file_, rev=None, cache=None, **opts):
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3716
    """Benchmark obtaining a revlog revision.
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3717
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3718
    Obtaining a revlog revision consists of roughly the following steps:
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3719
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3720
    1. Compute the delta chain
40581
e6c8a0fd3db4 perf: measure slicing time in perfrevlogrevision
Boris Feld <boris.feld@octobus.net>
parents: 40580
diff changeset
  3721
    2. Slice the delta chain if applicable
e6c8a0fd3db4 perf: measure slicing time in perfrevlogrevision
Boris Feld <boris.feld@octobus.net>
parents: 40580
diff changeset
  3722
    3. Obtain the raw chunks for that delta chain
e6c8a0fd3db4 perf: measure slicing time in perfrevlogrevision
Boris Feld <boris.feld@octobus.net>
parents: 40580
diff changeset
  3723
    4. Decompress each raw chunk
e6c8a0fd3db4 perf: measure slicing time in perfrevlogrevision
Boris Feld <boris.feld@octobus.net>
parents: 40580
diff changeset
  3724
    5. Apply binary patches to obtain fulltext
e6c8a0fd3db4 perf: measure slicing time in perfrevlogrevision
Boris Feld <boris.feld@octobus.net>
parents: 40580
diff changeset
  3725
    6. Verify hash of fulltext
27470
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3726
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3727
    This command measures the time spent in each of these phases.
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3728
    """
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  3729
    opts = _byteskwargs(opts)
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  3730
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3731
    if opts.get(b'changelog') or opts.get(b'manifest'):
27470
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3732
        file_, rev = None, file_
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3733
    elif rev is None:
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3734
        raise error.CommandError(b'perfrevlogrevision', b'invalid arguments')
27470
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3735
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3736
    r = cmdutil.openrevlog(repo, b'perfrevlogrevision', file_, opts)
32269
75e93d95aae6 revlog: rename _chunkraw to _getsegmentforrevs()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32268
diff changeset
  3737
75e93d95aae6 revlog: rename _chunkraw to _getsegmentforrevs()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32268
diff changeset
  3738
    # _chunkraw was renamed to _getsegmentforrevs.
75e93d95aae6 revlog: rename _chunkraw to _getsegmentforrevs()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32268
diff changeset
  3739
    try:
75e93d95aae6 revlog: rename _chunkraw to _getsegmentforrevs()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32268
diff changeset
  3740
        segmentforrevs = r._getsegmentforrevs
75e93d95aae6 revlog: rename _chunkraw to _getsegmentforrevs()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32268
diff changeset
  3741
    except AttributeError:
75e93d95aae6 revlog: rename _chunkraw to _getsegmentforrevs()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32268
diff changeset
  3742
        segmentforrevs = r._chunkraw
75e93d95aae6 revlog: rename _chunkraw to _getsegmentforrevs()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32268
diff changeset
  3743
27470
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3744
    node = r.lookup(rev)
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3745
    rev = r.rev(node)
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3746
30914
74cfc4357c64 perf: split obtaining chunks from decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30796
diff changeset
  3747
    def getrawchunks(data, chain):
74cfc4357c64 perf: split obtaining chunks from decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30796
diff changeset
  3748
        start = r.start
74cfc4357c64 perf: split obtaining chunks from decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30796
diff changeset
  3749
        length = r.length
74cfc4357c64 perf: split obtaining chunks from decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30796
diff changeset
  3750
        inline = r._inline
46974
3c9208702db3 revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46973
diff changeset
  3751
        try:
3c9208702db3 revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46973
diff changeset
  3752
            iosize = r.index.entry_size
3c9208702db3 revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46973
diff changeset
  3753
        except AttributeError:
3c9208702db3 revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46973
diff changeset
  3754
            iosize = r._io.size
30914
74cfc4357c64 perf: split obtaining chunks from decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30796
diff changeset
  3755
        buffer = util.buffer
74cfc4357c64 perf: split obtaining chunks from decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30796
diff changeset
  3756
74cfc4357c64 perf: split obtaining chunks from decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30796
diff changeset
  3757
        chunks = []
74cfc4357c64 perf: split obtaining chunks from decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30796
diff changeset
  3758
        ladd = chunks.append
40580
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3759
        for idx, item in enumerate(chain):
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3760
            offset = start(item[0])
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3761
            bits = data[idx]
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3762
            for rev in item:
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3763
                chunkstart = start(rev)
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3764
                if inline:
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3765
                    chunkstart += (rev + 1) * iosize
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3766
                chunklength = length(rev)
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3767
                ladd(buffer(bits, chunkstart - offset, chunklength))
30914
74cfc4357c64 perf: split obtaining chunks from decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30796
diff changeset
  3768
74cfc4357c64 perf: split obtaining chunks from decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30796
diff changeset
  3769
        return chunks
74cfc4357c64 perf: split obtaining chunks from decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30796
diff changeset
  3770
27470
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3771
    def dodeltachain(rev):
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3772
        if not cache:
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3773
            r.clearcaches()
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3774
        r._deltachain(rev)
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3775
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3776
    def doread(chain):
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3777
        if not cache:
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3778
            r.clearcaches()
40580
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3779
        for item in slicedchain:
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3780
            segmentforrevs(item[0], item[-1])
27470
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3781
40581
e6c8a0fd3db4 perf: measure slicing time in perfrevlogrevision
Boris Feld <boris.feld@octobus.net>
parents: 40580
diff changeset
  3782
    def doslice(r, chain, size):
e6c8a0fd3db4 perf: measure slicing time in perfrevlogrevision
Boris Feld <boris.feld@octobus.net>
parents: 40580
diff changeset
  3783
        for s in slicechunk(r, chain, targetsize=size):
e6c8a0fd3db4 perf: measure slicing time in perfrevlogrevision
Boris Feld <boris.feld@octobus.net>
parents: 40580
diff changeset
  3784
            pass
e6c8a0fd3db4 perf: measure slicing time in perfrevlogrevision
Boris Feld <boris.feld@octobus.net>
parents: 40580
diff changeset
  3785
30914
74cfc4357c64 perf: split obtaining chunks from decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30796
diff changeset
  3786
    def dorawchunks(data, chain):
27470
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3787
        if not cache:
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3788
            r.clearcaches()
30914
74cfc4357c64 perf: split obtaining chunks from decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30796
diff changeset
  3789
        getrawchunks(data, chain)
27470
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3790
30914
74cfc4357c64 perf: split obtaining chunks from decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30796
diff changeset
  3791
    def dodecompress(chunks):
74cfc4357c64 perf: split obtaining chunks from decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30796
diff changeset
  3792
        decomp = r.decompress
74cfc4357c64 perf: split obtaining chunks from decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30796
diff changeset
  3793
        for chunk in chunks:
74cfc4357c64 perf: split obtaining chunks from decompression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30796
diff changeset
  3794
            decomp(chunk)
27470
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3795
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3796
    def dopatch(text, bins):
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3797
        if not cache:
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3798
            r.clearcaches()
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3799
        mdiff.patches(text, bins)
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3800
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3801
    def dohash(text):
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3802
        if not cache:
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3803
            r.clearcaches()
30589
be5b2098a817 revlog: merge hash checking subfunctions
Remi Chaintron <remi@fb.com>
parents: 30460
diff changeset
  3804
        r.checkhash(text, node, rev=rev)
27470
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3805
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3806
    def dorevision():
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3807
        if not cache:
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3808
            r.clearcaches()
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3809
        r.revision(node)
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3810
40580
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3811
    try:
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3812
        from mercurial.revlogutils.deltas import slicechunk
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3813
    except ImportError:
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3814
        slicechunk = getattr(revlog, '_slicechunk', None)
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3815
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3816
    size = r.length(rev)
27470
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3817
    chain = r._deltachain(rev)[0]
40580
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3818
    if not getattr(r, '_withsparseread', False):
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3819
        slicedchain = (chain,)
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3820
    else:
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3821
        slicedchain = tuple(slicechunk(r, chain, targetsize=size))
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3822
    data = [segmentforrevs(seg[0], seg[-1])[1] for seg in slicedchain]
914079ee3334 perf: teach perfrevlogrevision about sparse reading
Boris Feld <boris.feld@octobus.net>
parents: 40579
diff changeset
  3823
    rawchunks = getrawchunks(data, slicedchain)
27470
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3824
    bins = r._chunks(chain)
40214
b456b2e0ad9f py3: make test-contrib-perf.t work on python 3
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40145
diff changeset
  3825
    text = bytes(bins[0])
27470
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3826
    bins = bins[1:]
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3827
    text = mdiff.patches(text, bins)
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3828
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3829
    benches = [
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3830
        (lambda: dorevision(), b'full'),
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3831
        (lambda: dodeltachain(rev), b'deltachain'),
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3832
        (lambda: doread(chain), b'read'),
40581
e6c8a0fd3db4 perf: measure slicing time in perfrevlogrevision
Boris Feld <boris.feld@octobus.net>
parents: 40580
diff changeset
  3833
    ]
e6c8a0fd3db4 perf: measure slicing time in perfrevlogrevision
Boris Feld <boris.feld@octobus.net>
parents: 40580
diff changeset
  3834
e6c8a0fd3db4 perf: measure slicing time in perfrevlogrevision
Boris Feld <boris.feld@octobus.net>
parents: 40580
diff changeset
  3835
    if getattr(r, '_withsparseread', False):
e6c8a0fd3db4 perf: measure slicing time in perfrevlogrevision
Boris Feld <boris.feld@octobus.net>
parents: 40580
diff changeset
  3836
        slicing = (lambda: doslice(r, chain, size), b'slice-sparse-chain')
e6c8a0fd3db4 perf: measure slicing time in perfrevlogrevision
Boris Feld <boris.feld@octobus.net>
parents: 40580
diff changeset
  3837
        benches.append(slicing)
e6c8a0fd3db4 perf: measure slicing time in perfrevlogrevision
Boris Feld <boris.feld@octobus.net>
parents: 40580
diff changeset
  3838
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3839
    benches.extend(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3840
        [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3841
            (lambda: dorawchunks(data, slicedchain), b'rawchunks'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3842
            (lambda: dodecompress(rawchunks), b'decompress'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3843
            (lambda: dopatch(text, bins), b'patch'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3844
            (lambda: dohash(text), b'hash'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3845
        ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3846
    )
27470
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3847
40579
cf3bef7f162b perf: use the same timer for all section of perfrevlogrevision
Boris Feld <boris.feld@octobus.net>
parents: 40349
diff changeset
  3848
    timer, fm = gettimer(ui, opts)
27470
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3849
    for fn, title in benches:
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3850
        timer(fn, title=title)
40579
cf3bef7f162b perf: use the same timer for all section of perfrevlogrevision
Boris Feld <boris.feld@octobus.net>
parents: 40349
diff changeset
  3851
    fm.end()
27470
d394a1a3708a perf: add perfrevlogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27467
diff changeset
  3852
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3853
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3854
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  3855
    b'perf::revset|perfrevset',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3856
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3857
        (b'C', b'clear', False, b'clear volatile cache between each call.'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3858
        (b'', b'contexts', False, b'obtain changectx for each revision'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3859
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3860
    + formatteropts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3861
    b"REVSET",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3862
)
27072
e18a9ceade3b perf: support obtaining contexts from perfrevset
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27017
diff changeset
  3863
def perfrevset(ui, repo, expr, clear=False, contexts=False, **opts):
18239
a95f1d619bb7 perftest: add an option to invalidate volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18238
diff changeset
  3864
    """benchmark the execution time of a revset
a95f1d619bb7 perftest: add an option to invalidate volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18238
diff changeset
  3865
18644
3e92772d5383 spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents: 18304
diff changeset
  3866
    Use the --clean option if need to evaluate the impact of build volatile
18239
a95f1d619bb7 perftest: add an option to invalidate volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18238
diff changeset
  3867
    revisions set cache on the revset execution. Volatile cache hold filtered
a95f1d619bb7 perftest: add an option to invalidate volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18238
diff changeset
  3868
    and obsolete related cache."""
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  3869
    opts = _byteskwargs(opts)
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  3870
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  3871
    timer, fm = gettimer(ui, opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3872
18062
1471f5e83686 perf: add a command to measure revset performance
Siddharth Agarwal <sid0@fb.com>
parents: 18033
diff changeset
  3873
    def d():
18239
a95f1d619bb7 perftest: add an option to invalidate volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18238
diff changeset
  3874
        if clear:
a95f1d619bb7 perftest: add an option to invalidate volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18238
diff changeset
  3875
            repo.invalidatevolatilesets()
27072
e18a9ceade3b perf: support obtaining contexts from perfrevset
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27017
diff changeset
  3876
        if contexts:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3877
            for ctx in repo.set(expr):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3878
                pass
27072
e18a9ceade3b perf: support obtaining contexts from perfrevset
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27017
diff changeset
  3879
        else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3880
            for r in repo.revs(expr):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3881
                pass
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3882
18062
1471f5e83686 perf: add a command to measure revset performance
Siddharth Agarwal <sid0@fb.com>
parents: 18033
diff changeset
  3883
    timer(d)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  3884
    fm.end()
18240
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3885
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3886
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3887
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  3888
    b'perf::volatilesets|perfvolatilesets',
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  3889
    [
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  3890
        (b'', b'clear-obsstore', False, b'drop obsstore between each call.'),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  3891
    ]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3892
    + formatteropts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3893
)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  3894
def perfvolatilesets(ui, repo, *names, **opts):
18240
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3895
    """benchmark the computation of various volatile set
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3896
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3897
    Volatile set computes element related to filtering and obsolescence."""
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  3898
    opts = _byteskwargs(opts)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  3899
    timer, fm = gettimer(ui, opts)
18240
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3900
    repo = repo.unfiltered()
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3901
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3902
    def getobs(name):
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3903
        def d():
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3904
            repo.invalidatevolatilesets()
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3905
            if opts[b'clear_obsstore']:
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3906
                clearfilecache(repo, b'obsstore')
18240
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3907
            obsolete.getrevs(repo, name)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3908
18240
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3909
        return d
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3910
18241
f5ed27c51995 perftest: allow selection of volatile set to benchmark
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18240
diff changeset
  3911
    allobs = sorted(obsolete.cachefuncs)
f5ed27c51995 perftest: allow selection of volatile set to benchmark
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18240
diff changeset
  3912
    if names:
f5ed27c51995 perftest: allow selection of volatile set to benchmark
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18240
diff changeset
  3913
        allobs = [n for n in allobs if n in names]
f5ed27c51995 perftest: allow selection of volatile set to benchmark
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18240
diff changeset
  3914
f5ed27c51995 perftest: allow selection of volatile set to benchmark
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18240
diff changeset
  3915
    for name in allobs:
18240
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3916
        timer(getobs(name), title=name)
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3917
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3918
    def getfiltered(name):
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3919
        def d():
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3920
            repo.invalidatevolatilesets()
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3921
            if opts[b'clear_obsstore']:
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3922
                clearfilecache(repo, b'obsstore')
20205
d67a7758da6d perf: fix perfvolatilesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20178
diff changeset
  3923
            repoview.filterrevs(repo, name)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3924
18240
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3925
        return d
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3926
18241
f5ed27c51995 perftest: allow selection of volatile set to benchmark
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18240
diff changeset
  3927
    allfilter = sorted(repoview.filtertable)
f5ed27c51995 perftest: allow selection of volatile set to benchmark
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18240
diff changeset
  3928
    if names:
f5ed27c51995 perftest: allow selection of volatile set to benchmark
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18240
diff changeset
  3929
        allfilter = [n for n in allfilter if n in names]
f5ed27c51995 perftest: allow selection of volatile set to benchmark
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18240
diff changeset
  3930
f5ed27c51995 perftest: allow selection of volatile set to benchmark
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18240
diff changeset
  3931
    for name in allfilter:
18240
a8318715d8bb perftest: add a command to benchmark construction of volatile cache
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18239
diff changeset
  3932
        timer(getfiltered(name), title=name)
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  3933
    fm.end()
18304
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3934
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3935
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3936
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  3937
    b'perf::branchmap|perfbranchmap',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3938
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3939
        (b'f', b'full', False, b'Includes build time of subset'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3940
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3941
            b'',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3942
            b'clear-revbranch',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3943
            False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3944
            b'purge the revbranch cache between computation',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3945
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3946
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3947
    + formatteropts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3948
)
36393
c25290b98190 perfbranchmap: allow to select the filter to benchmark
Boris Feld <boris.feld@octobus.net>
parents: 36392
diff changeset
  3949
def perfbranchmap(ui, repo, *filternames, **opts):
18304
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3950
    """benchmark the update of a branchmap
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3951
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3952
    This benchmarks the full repo.branchmap() call with read and write disabled
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3953
    """
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  3954
    opts = _byteskwargs(opts)
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3955
    full = opts.get(b"full", False)
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3956
    clear_revbranch = opts.get(b"clear_revbranch", False)
25494
e8eb3ecdaa0c perf: support -T for every perf commands
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24607
diff changeset
  3957
    timer, fm = gettimer(ui, opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3958
18304
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3959
    def getbranchmap(filtername):
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3960
        """generate a benchmark function for the filtername"""
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3961
        if filtername is None:
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3962
            view = repo
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3963
        else:
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3964
            view = repo.filtered(filtername)
41626
328ca3b9e545 branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents: 41579
diff changeset
  3965
        if util.safehasattr(view._branchcaches, '_per_filter'):
328ca3b9e545 branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents: 41579
diff changeset
  3966
            filtered = view._branchcaches._per_filter
328ca3b9e545 branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents: 41579
diff changeset
  3967
        else:
328ca3b9e545 branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents: 41579
diff changeset
  3968
            # older versions
328ca3b9e545 branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents: 41579
diff changeset
  3969
            filtered = view._branchcaches
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3970
18304
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3971
        def d():
32730
326c0e2c1a1d perfbranchmap: add an option to purge the revbranch cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32565
diff changeset
  3972
            if clear_revbranch:
326c0e2c1a1d perfbranchmap: add an option to purge the revbranch cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32565
diff changeset
  3973
                repo.revbranchcache()._clear()
18304
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3974
            if full:
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3975
                view._branchcaches.clear()
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3976
            else:
41626
328ca3b9e545 branchmap: encapsulate cache updating in the map itself
Martijn Pieters <mj@octobus.net>
parents: 41579
diff changeset
  3977
                filtered.pop(filtername, None)
18304
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3978
            view.branchmap()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3979
18304
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3980
        return d
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  3981
18304
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3982
    # add filter in smaller subset to bigger subset
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3983
    possiblefilters = set(repoview.filtertable)
36393
c25290b98190 perfbranchmap: allow to select the filter to benchmark
Boris Feld <boris.feld@octobus.net>
parents: 36392
diff changeset
  3984
    if filternames:
c25290b98190 perfbranchmap: allow to select the filter to benchmark
Boris Feld <boris.feld@octobus.net>
parents: 36392
diff changeset
  3985
        possiblefilters &= set(filternames)
30144
14031d183048 perf: get subsettable from appropriate module for Mercurial earlier than 2.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30143
diff changeset
  3986
    subsettable = getbranchmapsubsettable()
18304
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3987
    allfilters = []
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3988
    while possiblefilters:
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3989
        for name in possiblefilters:
30144
14031d183048 perf: get subsettable from appropriate module for Mercurial earlier than 2.9
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30143
diff changeset
  3990
            subset = subsettable.get(name)
18304
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3991
            if subset not in possiblefilters:
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3992
                break
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3993
        else:
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  3994
            assert False, b'subset cycle %s!' % possiblefilters
18304
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3995
        allfilters.append(name)
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3996
        possiblefilters.remove(name)
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3997
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3998
    # warm the cache
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  3999
    if not full:
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  4000
        for name in allfilters:
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  4001
            repo.filtered(name).branchmap()
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  4002
    if not filternames or b'unfiltered' in filternames:
36393
c25290b98190 perfbranchmap: allow to select the filter to benchmark
Boris Feld <boris.feld@octobus.net>
parents: 36392
diff changeset
  4003
        # add unfiltered
c25290b98190 perfbranchmap: allow to select the filter to benchmark
Boris Feld <boris.feld@octobus.net>
parents: 36392
diff changeset
  4004
        allfilters.append(None)
30145
113aa6145020 perf: avoid actual writing branch cache out correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30144
diff changeset
  4005
41579
bf7fb97aecf1 branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents: 41484
diff changeset
  4006
    if util.safehasattr(branchmap.branchcache, 'fromfile'):
bf7fb97aecf1 branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents: 41484
diff changeset
  4007
        branchcacheread = safeattrsetter(branchmap.branchcache, b'fromfile')
bf7fb97aecf1 branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents: 41484
diff changeset
  4008
        branchcacheread.set(classmethod(lambda *args: None))
bf7fb97aecf1 branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents: 41484
diff changeset
  4009
    else:
bf7fb97aecf1 branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents: 41484
diff changeset
  4010
        # older versions
bf7fb97aecf1 branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents: 41484
diff changeset
  4011
        branchcacheread = safeattrsetter(branchmap, b'read')
bf7fb97aecf1 branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents: 41484
diff changeset
  4012
        branchcacheread.set(lambda *args: None)
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  4013
    branchcachewrite = safeattrsetter(branchmap.branchcache, b'write')
41579
bf7fb97aecf1 branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents: 41484
diff changeset
  4014
    branchcachewrite.set(lambda *args: None)
18304
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  4015
    try:
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  4016
        for name in allfilters:
36392
df3f7f00a3fc perfbranchmap: display 'unfiltered' for unfiltered performance
Boris Feld <boris.feld@octobus.net>
parents: 36216
diff changeset
  4017
            printname = name
df3f7f00a3fc perfbranchmap: display 'unfiltered' for unfiltered performance
Boris Feld <boris.feld@octobus.net>
parents: 36216
diff changeset
  4018
            if name is None:
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  4019
                printname = b'unfiltered'
46255
cce05a6c271f perf: don't turn byte to string when formatting perfbranchmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46196
diff changeset
  4020
            timer(getbranchmap(name), title=printname)
18304
9b6ae29d4801 perf: add perfbranchmap command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18241
diff changeset
  4021
    finally:
30145
113aa6145020 perf: avoid actual writing branch cache out correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30144
diff changeset
  4022
        branchcacheread.restore()
113aa6145020 perf: avoid actual writing branch cache out correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30144
diff changeset
  4023
        branchcachewrite.restore()
23171
8afae1d5d108 perf: use a formatter for output
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22780
diff changeset
  4024
    fm.end()
23485
ccb93e9affc1 perf: add a perfloadmarkers command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23171
diff changeset
  4025
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4026
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4027
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  4028
    b'perf::branchmapupdate|perfbranchmapupdate',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4029
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4030
        (b'', b'base', [], b'subset of revision to start from'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4031
        (b'', b'target', [], b'subset of revision to end with'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4032
        (b'', b'clear-caches', False, b'clear cache between each runs'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4033
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4034
    + formatteropts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4035
)
40802
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4036
def perfbranchmapupdate(ui, repo, base=(), target=(), **opts):
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4037
    """benchmark branchmap update from for <base> revs to <target> revs
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4038
40806
5cbb74999040 perf: add a `--clear-caches` to `perfbranchmapupdate`
Boris Feld <boris.feld@octobus.net>
parents: 40805
diff changeset
  4039
    If `--clear-caches` is passed, the following items will be reset before
5cbb74999040 perf: add a `--clear-caches` to `perfbranchmapupdate`
Boris Feld <boris.feld@octobus.net>
parents: 40805
diff changeset
  4040
    each update:
5cbb74999040 perf: add a `--clear-caches` to `perfbranchmapupdate`
Boris Feld <boris.feld@octobus.net>
parents: 40805
diff changeset
  4041
        * the changelog instance and associated indexes
5cbb74999040 perf: add a `--clear-caches` to `perfbranchmapupdate`
Boris Feld <boris.feld@octobus.net>
parents: 40805
diff changeset
  4042
        * the rev-branch-cache instance
5cbb74999040 perf: add a `--clear-caches` to `perfbranchmapupdate`
Boris Feld <boris.feld@octobus.net>
parents: 40805
diff changeset
  4043
40802
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4044
    Examples:
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4045
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4046
       # update for the one last revision
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4047
       $ hg perfbranchmapupdate --base 'not tip' --target 'tip'
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4048
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4049
       $ update for change coming with a new branch
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4050
       $ hg perfbranchmapupdate --base 'stable' --target 'default'
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4051
    """
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4052
    from mercurial import branchmap
40804
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4053
    from mercurial import repoview
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4054
40802
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4055
    opts = _byteskwargs(opts)
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4056
    timer, fm = gettimer(ui, opts)
40806
5cbb74999040 perf: add a `--clear-caches` to `perfbranchmapupdate`
Boris Feld <boris.feld@octobus.net>
parents: 40805
diff changeset
  4057
    clearcaches = opts[b'clear_caches']
40804
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4058
    unfi = repo.unfiltered()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4059
    x = [None]  # used to pass data between closure
40802
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4060
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4061
    # we use a `list` here to avoid possible side effect from smartset
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4062
    baserevs = list(scmutil.revrange(repo, base))
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4063
    targetrevs = list(scmutil.revrange(repo, target))
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4064
    if not baserevs:
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4065
        raise error.Abort(b'no revisions selected for --base')
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4066
    if not targetrevs:
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4067
        raise error.Abort(b'no revisions selected for --target')
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4068
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4069
    # make sure the target branchmap also contains the one in the base
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4070
    targetrevs = list(set(baserevs) | set(targetrevs))
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4071
    targetrevs.sort()
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4072
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4073
    cl = repo.changelog
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4074
    allbaserevs = list(cl.ancestors(baserevs, inclusive=True))
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4075
    allbaserevs.sort()
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4076
    alltargetrevs = frozenset(cl.ancestors(targetrevs, inclusive=True))
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4077
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4078
    newrevs = list(alltargetrevs.difference(allbaserevs))
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4079
    newrevs.sort()
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4080
40804
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4081
    allrevs = frozenset(unfi.changelog.revs())
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4082
    basefilterrevs = frozenset(allrevs.difference(allbaserevs))
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4083
    targetfilterrevs = frozenset(allrevs.difference(alltargetrevs))
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4084
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4085
    def basefilter(repo, visibilityexceptions=None):
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4086
        return basefilterrevs
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4087
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4088
    def targetfilter(repo, visibilityexceptions=None):
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4089
        return targetfilterrevs
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4090
40802
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4091
    msg = b'benchmark of branchmap with %d revisions with %d new ones\n'
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4092
    ui.status(msg % (len(allbaserevs), len(newrevs)))
40804
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4093
    if targetfilterrevs:
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4094
        msg = b'(%d revisions still filtered)\n'
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4095
        ui.status(msg % len(targetfilterrevs))
40802
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4096
40804
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4097
    try:
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4098
        repoview.filtertable[b'__perf_branchmap_update_base'] = basefilter
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4099
        repoview.filtertable[b'__perf_branchmap_update_target'] = targetfilter
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4100
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4101
        baserepo = repo.filtered(b'__perf_branchmap_update_base')
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4102
        targetrepo = repo.filtered(b'__perf_branchmap_update_target')
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4103
40805
58355a1de6b3 perf: start from an existing branchmap if possible
Boris Feld <boris.feld@octobus.net>
parents: 40804
diff changeset
  4104
        # try to find an existing branchmap to reuse
58355a1de6b3 perf: start from an existing branchmap if possible
Boris Feld <boris.feld@octobus.net>
parents: 40804
diff changeset
  4105
        subsettable = getbranchmapsubsettable()
58355a1de6b3 perf: start from an existing branchmap if possible
Boris Feld <boris.feld@octobus.net>
parents: 40804
diff changeset
  4106
        candidatefilter = subsettable.get(None)
58355a1de6b3 perf: start from an existing branchmap if possible
Boris Feld <boris.feld@octobus.net>
parents: 40804
diff changeset
  4107
        while candidatefilter is not None:
58355a1de6b3 perf: start from an existing branchmap if possible
Boris Feld <boris.feld@octobus.net>
parents: 40804
diff changeset
  4108
            candidatebm = repo.filtered(candidatefilter).branchmap()
58355a1de6b3 perf: start from an existing branchmap if possible
Boris Feld <boris.feld@octobus.net>
parents: 40804
diff changeset
  4109
            if candidatebm.validfor(baserepo):
58355a1de6b3 perf: start from an existing branchmap if possible
Boris Feld <boris.feld@octobus.net>
parents: 40804
diff changeset
  4110
                filtered = repoview.filterrevs(repo, candidatefilter)
58355a1de6b3 perf: start from an existing branchmap if possible
Boris Feld <boris.feld@octobus.net>
parents: 40804
diff changeset
  4111
                missing = [r for r in allbaserevs if r in filtered]
58355a1de6b3 perf: start from an existing branchmap if possible
Boris Feld <boris.feld@octobus.net>
parents: 40804
diff changeset
  4112
                base = candidatebm.copy()
58355a1de6b3 perf: start from an existing branchmap if possible
Boris Feld <boris.feld@octobus.net>
parents: 40804
diff changeset
  4113
                base.update(baserepo, missing)
58355a1de6b3 perf: start from an existing branchmap if possible
Boris Feld <boris.feld@octobus.net>
parents: 40804
diff changeset
  4114
                break
58355a1de6b3 perf: start from an existing branchmap if possible
Boris Feld <boris.feld@octobus.net>
parents: 40804
diff changeset
  4115
            candidatefilter = subsettable.get(candidatefilter)
58355a1de6b3 perf: start from an existing branchmap if possible
Boris Feld <boris.feld@octobus.net>
parents: 40804
diff changeset
  4116
        else:
58355a1de6b3 perf: start from an existing branchmap if possible
Boris Feld <boris.feld@octobus.net>
parents: 40804
diff changeset
  4117
            # no suitable subset where found
58355a1de6b3 perf: start from an existing branchmap if possible
Boris Feld <boris.feld@octobus.net>
parents: 40804
diff changeset
  4118
            base = branchmap.branchcache()
58355a1de6b3 perf: start from an existing branchmap if possible
Boris Feld <boris.feld@octobus.net>
parents: 40804
diff changeset
  4119
            base.update(baserepo, allbaserevs)
40802
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4120
40803
95f35c873463 perf: pre-indent some code in `perfbranchmapupdate`
Boris Feld <boris.feld@octobus.net>
parents: 40802
diff changeset
  4121
        def setup():
95f35c873463 perf: pre-indent some code in `perfbranchmapupdate`
Boris Feld <boris.feld@octobus.net>
parents: 40802
diff changeset
  4122
            x[0] = base.copy()
40806
5cbb74999040 perf: add a `--clear-caches` to `perfbranchmapupdate`
Boris Feld <boris.feld@octobus.net>
parents: 40805
diff changeset
  4123
            if clearcaches:
5cbb74999040 perf: add a `--clear-caches` to `perfbranchmapupdate`
Boris Feld <boris.feld@octobus.net>
parents: 40805
diff changeset
  4124
                unfi._revbranchcache = None
5cbb74999040 perf: add a `--clear-caches` to `perfbranchmapupdate`
Boris Feld <boris.feld@octobus.net>
parents: 40805
diff changeset
  4125
                clearchangelog(repo)
40802
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4126
40803
95f35c873463 perf: pre-indent some code in `perfbranchmapupdate`
Boris Feld <boris.feld@octobus.net>
parents: 40802
diff changeset
  4127
        def bench():
40804
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4128
            x[0].update(targetrepo, newrevs)
40803
95f35c873463 perf: pre-indent some code in `perfbranchmapupdate`
Boris Feld <boris.feld@octobus.net>
parents: 40802
diff changeset
  4129
95f35c873463 perf: pre-indent some code in `perfbranchmapupdate`
Boris Feld <boris.feld@octobus.net>
parents: 40802
diff changeset
  4130
        timer(bench, setup=setup)
95f35c873463 perf: pre-indent some code in `perfbranchmapupdate`
Boris Feld <boris.feld@octobus.net>
parents: 40802
diff changeset
  4131
        fm.end()
40804
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4132
    finally:
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4133
        repoview.filtertable.pop(b'__perf_branchmap_update_base', None)
b059388d976c perf: rely on repoview for perfbranchmapupdate
Boris Feld <boris.feld@octobus.net>
parents: 40803
diff changeset
  4134
        repoview.filtertable.pop(b'__perf_branchmap_update_target', None)
40802
f723014677a5 perf: add a `perfbranchmapupdate` command
Boris Feld <boris.feld@octobus.net>
parents: 40784
diff changeset
  4135
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4136
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4137
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  4138
    b'perf::branchmapload|perfbranchmapload',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4139
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4140
        (b'f', b'filter', b'', b'Specify repoview filter'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4141
        (b'', b'list', False, b'List brachmap filter caches'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4142
        (b'', b'clear-revlogs', False, b'refresh changelog and manifest'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4143
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4144
    + formatteropts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4145
)
40738
94d76ddac40a perf: update function name to match `perfbranchmapload` command
Boris Feld <boris.feld@octobus.net>
parents: 40737
diff changeset
  4146
def perfbranchmapload(ui, repo, filter=b'', list=False, **opts):
39151
222aba766015 perf: time loading branchmap caches
Martijn Pieters <mj@octobus.net>
parents: 39015
diff changeset
  4147
    """benchmark reading the branchmap"""
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  4148
    opts = _byteskwargs(opts)
40741
4240a1da4188 perf: add --clear-revlog flag to branchmapload
Boris Feld <boris.feld@octobus.net>
parents: 40740
diff changeset
  4149
    clearrevlogs = opts[b'clear_revlogs']
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  4150
39151
222aba766015 perf: time loading branchmap caches
Martijn Pieters <mj@octobus.net>
parents: 39015
diff changeset
  4151
    if list:
222aba766015 perf: time loading branchmap caches
Martijn Pieters <mj@octobus.net>
parents: 39015
diff changeset
  4152
        for name, kind, st in repo.cachevfs.readdir(stat=True):
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  4153
            if name.startswith(b'branch2'):
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  4154
                filtername = name.partition(b'-')[2] or b'unfiltered'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4155
                ui.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4156
                    b'%s - %s\n' % (filtername, util.bytecount(st.st_size))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4157
                )
39151
222aba766015 perf: time loading branchmap caches
Martijn Pieters <mj@octobus.net>
parents: 39015
diff changeset
  4158
        return
40759
0a3cc351d718 perf: fallback to subset if ondisk cache is missing in perfbranchmapload
Boris Feld <boris.feld@octobus.net>
parents: 40758
diff changeset
  4159
    if not filter:
0a3cc351d718 perf: fallback to subset if ondisk cache is missing in perfbranchmapload
Boris Feld <boris.feld@octobus.net>
parents: 40758
diff changeset
  4160
        filter = None
0a3cc351d718 perf: fallback to subset if ondisk cache is missing in perfbranchmapload
Boris Feld <boris.feld@octobus.net>
parents: 40758
diff changeset
  4161
    subsettable = getbranchmapsubsettable()
0a3cc351d718 perf: fallback to subset if ondisk cache is missing in perfbranchmapload
Boris Feld <boris.feld@octobus.net>
parents: 40758
diff changeset
  4162
    if filter is None:
0a3cc351d718 perf: fallback to subset if ondisk cache is missing in perfbranchmapload
Boris Feld <boris.feld@octobus.net>
parents: 40758
diff changeset
  4163
        repo = repo.unfiltered()
0a3cc351d718 perf: fallback to subset if ondisk cache is missing in perfbranchmapload
Boris Feld <boris.feld@octobus.net>
parents: 40758
diff changeset
  4164
    else:
39151
222aba766015 perf: time loading branchmap caches
Martijn Pieters <mj@octobus.net>
parents: 39015
diff changeset
  4165
        repo = repoview.repoview(repo, filter)
40758
578646b1e2b6 perf: prewarm the branchmap in perfbranchmapload
Boris Feld <boris.feld@octobus.net>
parents: 40752
diff changeset
  4166
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4167
    repo.branchmap()  # make sure we have a relevant, up to date branchmap
40758
578646b1e2b6 perf: prewarm the branchmap in perfbranchmapload
Boris Feld <boris.feld@octobus.net>
parents: 40752
diff changeset
  4168
41579
bf7fb97aecf1 branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents: 41484
diff changeset
  4169
    try:
bf7fb97aecf1 branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents: 41484
diff changeset
  4170
        fromfile = branchmap.branchcache.fromfile
bf7fb97aecf1 branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents: 41484
diff changeset
  4171
    except AttributeError:
bf7fb97aecf1 branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents: 41484
diff changeset
  4172
        # older versions
bf7fb97aecf1 branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents: 41484
diff changeset
  4173
        fromfile = branchmap.read
bf7fb97aecf1 branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents: 41484
diff changeset
  4174
40759
0a3cc351d718 perf: fallback to subset if ondisk cache is missing in perfbranchmapload
Boris Feld <boris.feld@octobus.net>
parents: 40758
diff changeset
  4175
    currentfilter = filter
39151
222aba766015 perf: time loading branchmap caches
Martijn Pieters <mj@octobus.net>
parents: 39015
diff changeset
  4176
    # try once without timer, the filter may not be cached
41579
bf7fb97aecf1 branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents: 41484
diff changeset
  4177
    while fromfile(repo) is None:
40759
0a3cc351d718 perf: fallback to subset if ondisk cache is missing in perfbranchmapload
Boris Feld <boris.feld@octobus.net>
parents: 40758
diff changeset
  4178
        currentfilter = subsettable.get(currentfilter)
0a3cc351d718 perf: fallback to subset if ondisk cache is missing in perfbranchmapload
Boris Feld <boris.feld@octobus.net>
parents: 40758
diff changeset
  4179
        if currentfilter is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4180
            raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4181
                b'No branchmap cached for %s repo' % (filter or b'unfiltered')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4182
            )
40759
0a3cc351d718 perf: fallback to subset if ondisk cache is missing in perfbranchmapload
Boris Feld <boris.feld@octobus.net>
parents: 40758
diff changeset
  4183
        repo = repo.filtered(currentfilter)
39151
222aba766015 perf: time loading branchmap caches
Martijn Pieters <mj@octobus.net>
parents: 39015
diff changeset
  4184
    timer, fm = gettimer(ui, opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4185
40741
4240a1da4188 perf: add --clear-revlog flag to branchmapload
Boris Feld <boris.feld@octobus.net>
parents: 40740
diff changeset
  4186
    def setup():
4240a1da4188 perf: add --clear-revlog flag to branchmapload
Boris Feld <boris.feld@octobus.net>
parents: 40740
diff changeset
  4187
        if clearrevlogs:
4240a1da4188 perf: add --clear-revlog flag to branchmapload
Boris Feld <boris.feld@octobus.net>
parents: 40740
diff changeset
  4188
            clearchangelog(repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4189
40739
30f443d34a7d perf: use an explicit function in perfbranchmapload
Boris Feld <boris.feld@octobus.net>
parents: 40738
diff changeset
  4190
    def bench():
41579
bf7fb97aecf1 branchmap: make branchcache responsible for reading
Martijn Pieters <mj@octobus.net>
parents: 41484
diff changeset
  4191
        fromfile(repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4192
40741
4240a1da4188 perf: add --clear-revlog flag to branchmapload
Boris Feld <boris.feld@octobus.net>
parents: 40740
diff changeset
  4193
    timer(bench, setup=setup)
39151
222aba766015 perf: time loading branchmap caches
Martijn Pieters <mj@octobus.net>
parents: 39015
diff changeset
  4194
    fm.end()
222aba766015 perf: time loading branchmap caches
Martijn Pieters <mj@octobus.net>
parents: 39015
diff changeset
  4195
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4196
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  4197
@command(b'perf::loadmarkers|perfloadmarkers')
23485
ccb93e9affc1 perf: add a perfloadmarkers command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23171
diff changeset
  4198
def perfloadmarkers(ui, repo):
ccb93e9affc1 perf: add a perfloadmarkers command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23171
diff changeset
  4199
    """benchmark the time to parse the on-disk markers for a repo
ccb93e9affc1 perf: add a perfloadmarkers command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23171
diff changeset
  4200
ccb93e9affc1 perf: add a perfloadmarkers command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23171
diff changeset
  4201
    Result is the number of markers in the repo."""
ccb93e9affc1 perf: add a perfloadmarkers command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23171
diff changeset
  4202
    timer, fm = gettimer(ui)
30146
148ccd1d9f2f perf: add functions to get vfs-like object for Mercurial earlier than 2.3
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30145
diff changeset
  4203
    svfs = getsvfs(repo)
46793
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46733
diff changeset
  4204
    timer(lambda: len(obsolete.obsstore(repo, svfs)))
23485
ccb93e9affc1 perf: add a perfloadmarkers command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23171
diff changeset
  4205
    fm.end()
27286
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4206
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4207
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4208
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  4209
    b'perf::lrucachedict|perflrucachedict',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4210
    formatteropts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4211
    + [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4212
        (b'', b'costlimit', 0, b'maximum total cost of items in cache'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4213
        (b'', b'mincost', 0, b'smallest cost of items in cache'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4214
        (b'', b'maxcost', 100, b'maximum cost of items in cache'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4215
        (b'', b'size', 4, b'size of cache'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4216
        (b'', b'gets', 10000, b'number of key lookups'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4217
        (b'', b'sets', 10000, b'number of key sets'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4218
        (b'', b'mixed', 10000, b'number of mixed mode operations'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4219
        (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4220
            b'',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4221
            b'mixedgetfreq',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4222
            50,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4223
            b'frequency of get vs set ops in mixed mode',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4224
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4225
    ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4226
    norepo=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4227
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4228
def perflrucache(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4229
    ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4230
    mincost=0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4231
    maxcost=100,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4232
    costlimit=0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4233
    size=4,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4234
    gets=10000,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4235
    sets=10000,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4236
    mixed=10000,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4237
    mixedgetfreq=50,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4238
    **opts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4239
):
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  4240
    opts = _byteskwargs(opts)
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  4241
27286
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4242
    def doinit():
39827
86dbeb7c9a11 py3: switch contrib/perf from xrange to pycompat.xrange
Matt Harbison <matt_harbison@yahoo.com>
parents: 39826
diff changeset
  4243
        for i in _xrange(10000):
27286
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4244
            util.lrucachedict(size)
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4245
39584
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4246
    costrange = list(range(mincost, maxcost + 1))
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4247
27286
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4248
    values = []
39827
86dbeb7c9a11 py3: switch contrib/perf from xrange to pycompat.xrange
Matt Harbison <matt_harbison@yahoo.com>
parents: 39826
diff changeset
  4249
    for i in _xrange(size):
39828
c4ab9fa81377 py3: work around the lack of sys.maxint in contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39827
diff changeset
  4250
        values.append(random.randint(0, _maxint))
27286
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4251
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4252
    # Get mode fills the cache and tests raw lookup performance with no
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4253
    # eviction.
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4254
    getseq = []
39827
86dbeb7c9a11 py3: switch contrib/perf from xrange to pycompat.xrange
Matt Harbison <matt_harbison@yahoo.com>
parents: 39826
diff changeset
  4255
    for i in _xrange(gets):
27286
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4256
        getseq.append(random.choice(values))
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4257
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4258
    def dogets():
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4259
        d = util.lrucachedict(size)
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4260
        for v in values:
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4261
            d[v] = v
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4262
        for key in getseq:
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4263
            value = d[key]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4264
            value  # silence pyflakes warning
27286
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4265
39584
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4266
    def dogetscost():
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4267
        d = util.lrucachedict(size, maxcost=costlimit)
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4268
        for i, v in enumerate(values):
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4269
            d.insert(v, v, cost=costs[i])
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4270
        for key in getseq:
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4271
            try:
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4272
                value = d[key]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4273
                value  # silence pyflakes warning
39584
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4274
            except KeyError:
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4275
                pass
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4276
27286
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4277
    # Set mode tests insertion speed with cache eviction.
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4278
    setseq = []
39584
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4279
    costs = []
39827
86dbeb7c9a11 py3: switch contrib/perf from xrange to pycompat.xrange
Matt Harbison <matt_harbison@yahoo.com>
parents: 39826
diff changeset
  4280
    for i in _xrange(sets):
39828
c4ab9fa81377 py3: work around the lack of sys.maxint in contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39827
diff changeset
  4281
        setseq.append(random.randint(0, _maxint))
39584
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4282
        costs.append(random.choice(costrange))
27286
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4283
39583
ee087f0d7db5 util: allow lrucachedict to track cost of entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39389
diff changeset
  4284
    def doinserts():
ee087f0d7db5 util: allow lrucachedict to track cost of entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39389
diff changeset
  4285
        d = util.lrucachedict(size)
ee087f0d7db5 util: allow lrucachedict to track cost of entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39389
diff changeset
  4286
        for v in setseq:
ee087f0d7db5 util: allow lrucachedict to track cost of entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39389
diff changeset
  4287
            d.insert(v, v)
ee087f0d7db5 util: allow lrucachedict to track cost of entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39389
diff changeset
  4288
39584
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4289
    def doinsertscost():
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4290
        d = util.lrucachedict(size, maxcost=costlimit)
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4291
        for i, v in enumerate(setseq):
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4292
            d.insert(v, v, cost=costs[i])
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4293
27286
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4294
    def dosets():
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4295
        d = util.lrucachedict(size)
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4296
        for v in setseq:
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4297
            d[v] = v
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4298
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4299
    # Mixed mode randomly performs gets and sets with eviction.
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4300
    mixedops = []
39827
86dbeb7c9a11 py3: switch contrib/perf from xrange to pycompat.xrange
Matt Harbison <matt_harbison@yahoo.com>
parents: 39826
diff changeset
  4301
    for i in _xrange(mixed):
27286
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4302
        r = random.randint(0, 100)
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4303
        if r < mixedgetfreq:
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4304
            op = 0
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4305
        else:
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4306
            op = 1
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4307
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4308
        mixedops.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4309
            (op, random.randint(0, size * 2), random.choice(costrange))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4310
        )
27286
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4311
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4312
    def domixed():
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4313
        d = util.lrucachedict(size)
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4314
39584
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4315
        for op, v, cost in mixedops:
27286
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4316
            if op == 0:
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4317
                try:
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4318
                    d[v]
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4319
                except KeyError:
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4320
                    pass
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4321
            else:
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4322
                d[v] = v
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4323
39584
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4324
    def domixedcost():
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4325
        d = util.lrucachedict(size, maxcost=costlimit)
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4326
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4327
        for op, v, cost in mixedops:
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4328
            if op == 0:
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4329
                try:
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4330
                    d[v]
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4331
                except KeyError:
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4332
                    pass
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4333
            else:
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4334
                d.insert(v, v, cost=cost)
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4335
27286
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4336
    benches = [
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  4337
        (doinit, b'init'),
27286
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4338
    ]
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4339
39584
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4340
    if costlimit:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4341
        benches.extend(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4342
            [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4343
                (dogetscost, b'gets w/ cost limit'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4344
                (doinsertscost, b'inserts w/ cost limit'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4345
                (domixedcost, b'mixed w/ cost limit'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4346
            ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4347
        )
39584
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4348
    else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4349
        benches.extend(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4350
            [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4351
                (dogets, b'gets'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4352
                (doinserts, b'inserts'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4353
                (dosets, b'sets'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4354
                (domixed, b'mixed'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4355
            ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4356
        )
39584
842cd0bdda75 util: teach lrucachedict to enforce a max total cost
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39583
diff changeset
  4357
27286
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4358
    for fn, title in benches:
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4359
        timer, fm = gettimer(ui, opts)
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4360
        timer(fn, title=title)
528cf1a73ae5 perf: add perflrucachedict command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27100
diff changeset
  4361
        fm.end()
29495
f83445296213 perf: use locally defined revlog option list for Mercurial earlier than 3.7
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29494
diff changeset
  4362
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4363
45016
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4364
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  4365
    b'perf::write|perfwrite',
45016
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4366
    formatteropts
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4367
    + [
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4368
        (b'', b'write-method', b'write', b'ui write method'),
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4369
        (b'', b'nlines', 100, b'number of lines'),
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4370
        (b'', b'nitems', 100, b'number of items (per line)'),
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4371
        (b'', b'item', b'x', b'item that is written'),
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4372
        (b'', b'batch-line', None, b'pass whole line to write method at once'),
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4373
        (b'', b'flush-line', None, b'flush after each line'),
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4374
    ],
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4375
)
30997
5a9e4dc8e4fd contrib: add a write microbenchmark to perf.py
Simon Farnsworth <simonfar@fb.com>
parents: 30995
diff changeset
  4376
def perfwrite(ui, repo, **opts):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45635
diff changeset
  4377
    """microbenchmark ui.write (and others)"""
39830
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  4378
    opts = _byteskwargs(opts)
874712506b07 py3: apply byteskwargs to contrib/perf
Matt Harbison <matt_harbison@yahoo.com>
parents: 39829
diff changeset
  4379
45016
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4380
    write = getattr(ui, _sysstr(opts[b'write_method']))
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4381
    nlines = int(opts[b'nlines'])
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4382
    nitems = int(opts[b'nitems'])
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4383
    item = opts[b'item']
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4384
    batch_line = opts.get(b'batch_line')
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4385
    flush_line = opts.get(b'flush_line')
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4386
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4387
    if batch_line:
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4388
        line = item * nitems + b'\n'
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4389
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4390
    def benchmark():
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4391
        for i in pycompat.xrange(nlines):
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4392
            if batch_line:
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4393
                write(line)
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4394
            else:
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4395
                for i in pycompat.xrange(nitems):
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4396
                    write(item)
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4397
                write(b'\n')
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4398
            if flush_line:
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4399
                ui.flush()
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4400
        ui.flush()
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4401
30997
5a9e4dc8e4fd contrib: add a write microbenchmark to perf.py
Simon Farnsworth <simonfar@fb.com>
parents: 30995
diff changeset
  4402
    timer, fm = gettimer(ui, opts)
45016
c2df0bca0dfa perf: make `hg perfwrite` more flexible
Manuel Jacob <me@manueljacob.de>
parents: 44470
diff changeset
  4403
    timer(benchmark)
30997
5a9e4dc8e4fd contrib: add a write microbenchmark to perf.py
Simon Farnsworth <simonfar@fb.com>
parents: 30995
diff changeset
  4404
    fm.end()
5a9e4dc8e4fd contrib: add a write microbenchmark to perf.py
Simon Farnsworth <simonfar@fb.com>
parents: 30995
diff changeset
  4405
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4406
29495
f83445296213 perf: use locally defined revlog option list for Mercurial earlier than 3.7
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29494
diff changeset
  4407
def uisetup(ui):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4408
    if util.safehasattr(cmdutil, b'openrevlog') and not util.safehasattr(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4409
        commands, b'debugrevlogopts'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4410
    ):
29495
f83445296213 perf: use locally defined revlog option list for Mercurial earlier than 3.7
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29494
diff changeset
  4411
        # for "historical portability":
f83445296213 perf: use locally defined revlog option list for Mercurial earlier than 3.7
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29494
diff changeset
  4412
        # In this case, Mercurial should be 1.9 (or a79fea6b3e77) -
f83445296213 perf: use locally defined revlog option list for Mercurial earlier than 3.7
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29494
diff changeset
  4413
        # 3.7 (or 5606f7d0d063). Therefore, '--dir' option for
f83445296213 perf: use locally defined revlog option list for Mercurial earlier than 3.7
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29494
diff changeset
  4414
        # openrevlog() should cause failure, because it has been
f83445296213 perf: use locally defined revlog option list for Mercurial earlier than 3.7
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29494
diff changeset
  4415
        # available since 3.5 (or 49c583ca48c4).
f83445296213 perf: use locally defined revlog option list for Mercurial earlier than 3.7
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29494
diff changeset
  4416
        def openrevlog(orig, repo, cmd, file_, opts):
39389
438f3932a432 contrib: byteify perf.py file
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39346
diff changeset
  4417
            if opts.get(b'dir') and not util.safehasattr(repo, b'dirlog'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4418
                raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4419
                    b"This version doesn't support --dir option",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4420
                    hint=b"use 3.5 or later",
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4421
                )
29495
f83445296213 perf: use locally defined revlog option list for Mercurial earlier than 3.7
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29494
diff changeset
  4422
            return orig(repo, cmd, file_, opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4423
50832
193a6e9a56f3 wrapfunction: use sysstr instead of bytes as argument in "perf"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50705
diff changeset
  4424
        name = _sysstr(b'openrevlog')
193a6e9a56f3 wrapfunction: use sysstr instead of bytes as argument in "perf"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50705
diff changeset
  4425
        extensions.wrapfunction(cmdutil, name, openrevlog)
40943
008f3491dc53 perf: add perfprogress command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40818
diff changeset
  4426
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4427
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4428
@command(
46460
d8ad391e10f5 command-namespace: use `::` are the command separator
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46428
diff changeset
  4429
    b'perf::progress|perfprogress',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4430
    formatteropts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4431
    + [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4432
        (b'', b'topic', b'topic', b'topic for progress messages'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4433
        (b'c', b'total', 1000000, b'total value we are progressing to'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4434
    ],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4435
    norepo=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43005
diff changeset
  4436
)
40943
008f3491dc53 perf: add perfprogress command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40818
diff changeset
  4437
def perfprogress(ui, topic=None, total=None, **opts):
008f3491dc53 perf: add perfprogress command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40818
diff changeset
  4438
    """printing of progress bars"""
008f3491dc53 perf: add perfprogress command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40818
diff changeset
  4439
    opts = _byteskwargs(opts)
008f3491dc53 perf: add perfprogress command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40818
diff changeset
  4440
008f3491dc53 perf: add perfprogress command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40818
diff changeset
  4441
    timer, fm = gettimer(ui, opts)
008f3491dc53 perf: add perfprogress command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40818
diff changeset
  4442
008f3491dc53 perf: add perfprogress command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40818
diff changeset
  4443
    def doprogress():
008f3491dc53 perf: add perfprogress command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40818
diff changeset
  4444
        with ui.makeprogress(topic, total=total) as progress:
42801
c00005975c91 perf: don't depend on pycompat for older Mercurial versions
Martin von Zweigbergk <martinvonz@google.com>
parents: 42800
diff changeset
  4445
            for i in _xrange(total):
40943
008f3491dc53 perf: add perfprogress command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40818
diff changeset
  4446
                progress.increment()
008f3491dc53 perf: add perfprogress command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40818
diff changeset
  4447
008f3491dc53 perf: add perfprogress command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40818
diff changeset
  4448
    timer(doprogress)
008f3491dc53 perf: add perfprogress command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40818
diff changeset
  4449
    fm.end()