Skip to content
Snippets Groups Projects
  • Raphaël Gomès's avatar
    8b7123c8
    update: add a Rust fast-path when updating from null (and clean) · 8b7123c8
    Raphaël Gomès authored
    This case is easy to detect and we have all we need to generate a valid
    working copy and dirstate entirely in Rust, which speeds things up
    considerably:
    
    On my machine updating a repo of ~300k files goes from 10.00s down to 4.2s,
    all while consuming 50% less system time, with all caches hot.
    Something to note is that further improvements will probably happen
    with the upcoming `InnerRevlog` series that does smarter
    mmap hanlding, especially for filelogs.
    
    Here are benchmark numbers on a machine with only 4 cores (and no SMT enabled)
    
    ```
    ### data-env-vars.name               = heptapod-public-2024-03-25-ds2-pnm
      # benchmark.name                   = hg.command.update
      # bin-env-vars.hg.py-re2-module    = default
      # bin-env-vars.hg.changeset.node   = <this change>
      # benchmark.variants.atomic-update = no
      # benchmark.variants.scenario      = null-to-tip
      # benchmark.variants.worker        = default
    default: 5.328762  ~~~~~
    rust: 1.308654  (-75.44%, -4.02)
    ### data-env-vars.name               = mercurial-devel-2024-03-22-ds2-pnm
      # benchmark.name                   = hg.command.update
      # bin-env-vars.hg.py-re2-module    = default
      # bin-env-vars.hg.changeset.node   = <this change>
      # benchmark.variants.atomic-update = no
      # benchmark.variants.scenario      = null-to-tip
      # benchmark.variants.worker        = default
    default: 1.693271  ~~~~~
    rust: 1.151053  (-32.02%, -0.54)
    ### data-env-vars.name               = mozilla-unified-2024-03-22-ds2-pnm
      # benchmark.name                   = hg.command.update
      # bin-env-vars.hg.py-re2-module    = default
      # bin-env-vars.hg.changeset.node   = <this change>
      # benchmark.variants.atomic-update = no
      # benchmark.variants.scenario      = null-to-tip
      # benchmark.variants.worker        = default
    default: 38.901613  ~~~~~
    rust: 11.637880 (-70.08%, -27.26)
    ### data-env-vars.name               = netbsd-xsrc-public-2024-09-19-ds2-pnm
      # benchmark.name                   = hg.command.update
      # bin-env-vars.hg.py-re2-module    = default
      # bin-env-vars.hg.changeset.node   = <this change>
      # benchmark.variants.atomic-update = no
      # benchmark.variants.scenario      = null-to-tip
      # benchmark.variants.worker        = default
    default: 4.793727  ~~~~~
    rust: 1.505905  (-68.59%, -3.29)
    ```
    8b7123c8
    History
    update: add a Rust fast-path when updating from null (and clean)
    Raphaël Gomès authored
    This case is easy to detect and we have all we need to generate a valid
    working copy and dirstate entirely in Rust, which speeds things up
    considerably:
    
    On my machine updating a repo of ~300k files goes from 10.00s down to 4.2s,
    all while consuming 50% less system time, with all caches hot.
    Something to note is that further improvements will probably happen
    with the upcoming `InnerRevlog` series that does smarter
    mmap hanlding, especially for filelogs.
    
    Here are benchmark numbers on a machine with only 4 cores (and no SMT enabled)
    
    ```
    ### data-env-vars.name               = heptapod-public-2024-03-25-ds2-pnm
      # benchmark.name                   = hg.command.update
      # bin-env-vars.hg.py-re2-module    = default
      # bin-env-vars.hg.changeset.node   = <this change>
      # benchmark.variants.atomic-update = no
      # benchmark.variants.scenario      = null-to-tip
      # benchmark.variants.worker        = default
    default: 5.328762  ~~~~~
    rust: 1.308654  (-75.44%, -4.02)
    ### data-env-vars.name               = mercurial-devel-2024-03-22-ds2-pnm
      # benchmark.name                   = hg.command.update
      # bin-env-vars.hg.py-re2-module    = default
      # bin-env-vars.hg.changeset.node   = <this change>
      # benchmark.variants.atomic-update = no
      # benchmark.variants.scenario      = null-to-tip
      # benchmark.variants.worker        = default
    default: 1.693271  ~~~~~
    rust: 1.151053  (-32.02%, -0.54)
    ### data-env-vars.name               = mozilla-unified-2024-03-22-ds2-pnm
      # benchmark.name                   = hg.command.update
      # bin-env-vars.hg.py-re2-module    = default
      # bin-env-vars.hg.changeset.node   = <this change>
      # benchmark.variants.atomic-update = no
      # benchmark.variants.scenario      = null-to-tip
      # benchmark.variants.worker        = default
    default: 38.901613  ~~~~~
    rust: 11.637880 (-70.08%, -27.26)
    ### data-env-vars.name               = netbsd-xsrc-public-2024-09-19-ds2-pnm
      # benchmark.name                   = hg.command.update
      # bin-env-vars.hg.py-re2-module    = default
      # bin-env-vars.hg.changeset.node   = <this change>
      # benchmark.variants.atomic-update = no
      # benchmark.variants.scenario      = null-to-tip
      # benchmark.variants.worker        = default
    default: 4.793727  ~~~~~
    rust: 1.505905  (-68.59%, -3.29)
    ```