##// END OF EJS Templates
branchmap-v3: filter topo heads using node for performance reason...
branchmap-v3: filter topo heads using node for performance reason The branchmap currently contains heads as nodeid. If we build a set of revnum with the topological heads, we need to turn the nodeid in the branchmap to revnum to be able to check if they are topo-heads. That nodeid → revnum lookup is "expensive" and adds up to something noticeable if you do it hundreds of thousand of time. Instead we turn all the topo-heads revnums into nodes and build a set. So we can directly test membership of the nodeids stored in the branchmap. That is much faster. Ideally we would have revnum in the branchmap and could directly test revnum against a revnum set and that would be even faster. However that's an adventure for another time. Without this change, the branchmap format "v3" was significantly slower than the "v2" format. With this changes, some of that gap is recovered With rust + persistent nodemap, this overhead was smaller because the extra lookup did not had to to build the nodemap from scratch. In addition the mozilla-unified repository is able to use the "pure_top" mode of branchmap v3, so it was not really affected by this. Future changeset will work of the remaining of the performance gap. ### benchmark.name = hg.command.unbundle # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = disabled # benchmark.variants.resource-usage = default # benchmark.variants.reuse-external-delta-parent = yes # benchmark.variants.revs = any-1-extra-rev # benchmark.variants.source = unbundle # benchmark.variants.validate = default # benchmark.variants.verbosity = quiet ## data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog # bin-env-vars.hg.flavor = default branch-v2: 0.233711 ~~~~~ branch-v3 before: 0.380994 (+63.02%, +0.15) branch-v3 after: 0.368769 (+57.79%, +0.14) # bin-env-vars.hg.flavor = rust branch-v2: 0.235230 ~~~~~ branch-v3 before: 0.385060 (+63.70%, +0.15) branch-v3 after: 0.372460 (+58.34%, +0.14) ## data-env-vars.name = netbeans-2018-08-01-ds2-pnm # bin-env-vars.hg.flavor = rust branch-v2: 0.255586 ~~~~~ branch-v3 before: 0.317524 (+24.23%, +0.06) branch-v3 after: 0.318907 (+24.78%, +0.06) ## data-env-vars.name = mozilla-central-2024-03-22-zstd-sparse-revlog # bin-env-vars.hg.flavor = default branch-v2: 0.339010 ~~~~~ branch-v3 before: 0.410007 (+20.94%, +0.07) branch-v3 after: 0.349752 (+3.17%, +0.01) # bin-env-vars.hg.flavor = rust branch-v2: 0.346525 ~~~~~ branch-v3 before: 0.410428 (+18.44%, +0.06) branch-v3 after: 0.354300 (+2.24%, +0.01) ## data-env-vars.name = mozilla-central-2024-03-22-ds2-pnm # bin-env-vars.hg.flavor = rust branch-v2: 0.380202 ~~~~~ branch-v3 before: 0.393871 (+3.60%, +0.01) branch-v3 after: 0.396293 (+4.23%, +0.02) ## data-env-vars.name = mozilla-unified-2024-03-22-zstd-sparse-revlog # bin-env-vars.hg.flavor = default branch-v2: 0.412165 ~~~~~ branch-v3 before: 0.438105 (+6.29%, +0.03) branch-v3 after: 0.424769 (+3.06%, +0.01) # bin-env-vars.hg.flavor = rust branch-v2: 0.412397 ~~~~~ branch-v3 before: 0.438405 (+6.31%, +0.03) branch-v3 after: 0.421796 (+2.28%, +0.01) ## data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm # bin-env-vars.hg.flavor = rust branch-v2: 0.429501 ~~~~~ branch-v3 before: 0.452692 (+5.40%, +0.02) branch-v3 after: 0.443849 (+3.34%, +0.01) ## data-env-vars.name = mozilla-try-2024-03-26-zstd-sparse-revlog # bin-env-vars.hg.flavor = default branch-v2: 3.403171 ~~~~~ branch-v3 before: 6.562345 (+92.83%, +3.16) branch-v3 after: 6.234055 (+83.18%, +2.83) # bin-env-vars.hg.flavor = rust branch-v2: 3.454876 ~~~~~ branch-v3 before: 6.160248 (+78.31%, +2.71) branch-v3 after: 6.307813 (+82.58%, +2.85) ## data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm # bin-env-vars.hg.flavor = rust branch-v2: 3.465435 ~~~~~ branch-v3 before: 5.381648 (+55.30%, +1.92) branch-v3 after: 5.176076 (+49.36%, +1.71)

File last commit:

r52861:8060257f default
r52869:41b8892a default
Show More
parsers.pyi
96 lines | 3.6 KiB | text/x-python | PythonLexer
Gregory Szorc
cext: add .pyi files for C extensions...
r46652 from typing import (
Callable,
Dict,
Iterator,
List,
Optional,
Set,
Tuple,
Union,
)
version: int
versionerrortext: str
Matt Harbison
typing: add stub functions for `cext/charencoding`...
r52834 # From charencode.c
# Note: the first 'bytes' arg of isasciistr() can be typed as 'Buffer' from the
# typing_extensions backport, once the related bug is fixed in pytype, or pytype
# is run under py3.12. The arg for asciilower(), asciiupper() and
# jsonescapeu8fast() is checked specifically for the 'bytes' type. The 'bytes'
# return is an instance of 'bytes', not an alias for 'Buffer'.
#
# https://github.com/google/pytype/issues/1772
def isasciistr(s: bytes) -> bool: ...
def asciilower(s: bytes) -> bytes: ...
def asciiupper(s: bytes) -> bytes: ...
def jsonescapeu8fast(u8chars: bytes, paranoid: bool) -> bytes: ...
dirstate-item: rename the class to DirstateItem...
r48328 class DirstateItem:
Gregory Szorc
cext: add .pyi files for C extensions...
r46652 __doc__: str
def __len__(self) -> int: ...
def __getitem__(self, key: int) -> Union[bytes, int]: ...
# From dirs.c
class dirs:
__doc__: str
def __init__(self, source, skipchar: bytes): ...
def __iter__(self) -> Iterator[bytes]: ...
def addpath(self, path: bytes) -> None: ...
def delpath(self, path: bytes) -> None: ...
# From manifest.c
class lazymanifest:
Joerg Sonnenberger
manifests: push down expected node length into the parser...
r47817 def __init__(self, nodelen: int, data: bytes): ...
Gregory Szorc
cext: add .pyi files for C extensions...
r46652 def __iter__(self) -> Iterator[bytes]: ...
def __len__(self) -> int: ...
def __getitem__(self, item: bytes) -> Optional[Tuple[bytes, bytes]]: ...
def __setitem__(self, key: bytes, value: Tuple[bytes, bytes]) -> None: ...
def __delitem__(self, key: bytes) -> None: ...
def iterkeys(self) -> Iterator[bytes]: ...
def iterentries(self) -> Iterator[Tuple[bytes, bytes, bytes]]: ...
def copy(self) -> lazymanifest: ...
def filtercopy(self, matchfn: Callable[[bytes], bool]) -> lazymanifest: ...
def diff(self, other: lazymanifest, clean: Optional[bool]) -> Dict[bytes, Tuple[bytes, Tuple]]: ...
def text(self) -> bytes: ...
# From revlog.c
class index:
__doc__: str
nodemap: Dict[bytes, int]
def ancestors(self, *args: int) -> Iterator[int]: ...
def commonancestorsheads(self, *args: int) -> List[int]: ...
def clearcaches(self) -> None: ...
def get(self, value: bytes) -> Optional[int]: ...
def get_rev(self, value: bytes) -> Optional[int]: ...
def has_node(self, value: Union[int, bytes]) -> bool: ...
def rev(self, node: bytes) -> int: ...
phases: keep internal state as rev-num instead of node-id...
r52299 def computephasesmapsets(self, root: Dict[int, Set[int]]) -> Tuple[int, Dict[int, Set[bytes]]]: ...
Gregory Szorc
cext: add .pyi files for C extensions...
r46652 def reachableroots2(self, minroot: int, heads: List[int], roots: List[int], includepath: bool) -> List[int]: ...
def headrevs(self, filteredrevs: Optional[List[int]]) -> List[int]: ...
def issnapshot(self, value: int) -> bool: ...
def findsnapshots(self, cache: Dict[int, List[int]], start_rev: int) -> None: ...
def deltachain(self, rev: int, stop: int, generaldelta: bool) -> Tuple[List[int], bool]: ...
def slicechunktodensity(self, revs: List[int], targetdensity: float, mingapsize: int) -> List[List[int]]: ...
def append(self, value: Tuple[int, int, int, int, int, int, int, bytes]) -> None: ...
def partialmatch(self, node: bytes) -> bytes: ...
def shortest(self, value: bytes) -> int: ...
def stats(self) -> Dict[bytes, int]: ...
class nodetree:
__doc__: str
def insert(self, rev: int) -> None: ...
def shortest(self, node: bytes) -> int: ...
Matt Harbison
typing: add missing signature for mercurial.cext.parsers.parse_index2()...
r50544
# The IndexObject type here is defined in C, and there's no type for a buffer
# return, as of py3.11. https://github.com/python/typing/issues/593
def parse_index2(data: object, inline: object, format: int = ...) -> Tuple[object, Optional[Tuple[int, object]]]: ...