[PATCH 2 of 3 V2] perf: add perflrucachedict command

Augie Fackler raf at durin42.com
Mon Dec 7 16:51:50 CST 2015


On Sun, Dec 06, 2015 at 09:35:23PM -0800, Gregory Szorc wrote:
> # HG changeset patch
> # User Gregory Szorc <gregory.szorc at gmail.com>
> # Date 1449450470 28800
> #      Sun Dec 06 17:07:50 2015 -0800
> # Node ID 07aa6d894c36f7a0aa37a1896ef1779e8e9763ab
> # Parent  5631b16093b4fa86a81eb4f26c22e0d660801e61
> perf: add perflrucachedict command

Queued these, meditating on 3 now.

>
> It measures time to construct, perform gets, sets, or mixed mode
> operations on a cache of configurable size with variable numbers of
> operations.
>
> diff --git a/contrib/perf.py b/contrib/perf.py
> --- a/contrib/perf.py
> +++ b/contrib/perf.py
> @@ -1,14 +1,15 @@
>  # perf.py - performance test routines
>  '''helper extension to measure performance'''
>
>  from mercurial import cmdutil, scmutil, util, commands, obsolete
>  from mercurial import repoview, branchmap, merge, copies, error
>  import time, os, sys
> +import random
>  import functools
>
>  formatteropts = commands.formatteropts
>
>  cmdtable = {}
>  command = cmdutil.command(cmdtable)
>
>  def gettimer(ui, opts=None):
> @@ -574,8 +575,84 @@ def perfbranchmap(ui, repo, full=False,
>  @command('perfloadmarkers')
>  def perfloadmarkers(ui, repo):
>      """benchmark the time to parse the on-disk markers for a repo
>
>      Result is the number of markers in the repo."""
>      timer, fm = gettimer(ui)
>      timer(lambda: len(obsolete.obsstore(repo.svfs)))
>      fm.end()
> +
> + at command('perflrucachedict', formatteropts +
> +    [('', 'size', 4, 'size of cache'),
> +     ('', 'gets', 10000, 'number of key lookups'),
> +     ('', 'sets', 10000, 'number of key sets'),
> +     ('', 'mixed', 10000, 'number of mixed mode operations'),
> +     ('', 'mixedgetfreq', 50, 'frequency of get vs set ops in mixed mode')],
> +    norepo=True)
> +def perflrucache(ui, size=4, gets=10000, sets=10000, mixed=10000,
> +                 mixedgetfreq=50, **opts):
> +    def doinit():
> +        for i in xrange(10000):
> +            util.lrucachedict(size)
> +
> +    values = []
> +    for i in xrange(size):
> +        values.append(random.randint(0, sys.maxint))
> +
> +    # Get mode fills the cache and tests raw lookup performance with no
> +    # eviction.
> +    getseq = []
> +    for i in xrange(gets):
> +        getseq.append(random.choice(values))
> +
> +    def dogets():
> +        d = util.lrucachedict(size)
> +        for v in values:
> +            d[v] = v
> +        for key in getseq:
> +            value = d[key]
> +
> +    # Set mode tests insertion speed with cache eviction.
> +    setseq = []
> +    for i in xrange(sets):
> +        setseq.append(random.randint(0, sys.maxint))
> +
> +    def dosets():
> +        d = util.lrucachedict(size)
> +        for v in setseq:
> +            d[v] = v
> +
> +    # Mixed mode randomly performs gets and sets with eviction.
> +    mixedops = []
> +    for i in xrange(mixed):
> +        r = random.randint(0, 100)
> +        if r < mixedgetfreq:
> +            op = 0
> +        else:
> +            op = 1
> +
> +        mixedops.append((op, random.randint(0, size * 2)))
> +
> +    def domixed():
> +        d = util.lrucachedict(size)
> +
> +        for op, v in mixedops:
> +            if op == 0:
> +                try:
> +                    d[v]
> +                except KeyError:
> +                    pass
> +            else:
> +                d[v] = v
> +
> +    benches = [
> +        (doinit, 'init'),
> +        (dogets, 'gets'),
> +        (dosets, 'sets'),
> +        (domixed, 'mixed')
> +    ]
> +
> +    for fn, title in benches:
> +        timer, fm = gettimer(ui, opts)
> +        timer(fn, title=title)
> +        fm.end()
> +
> diff --git a/tests/test-contrib-perf.t b/tests/test-contrib-perf.t
> --- a/tests/test-contrib-perf.t
> +++ b/tests/test-contrib-perf.t
> @@ -70,16 +70,18 @@ perfstatus
>     perffncachewrite
>                   (no help text available)
>     perfheads     (no help text available)
>     perfindex     (no help text available)
>     perfloadmarkers
>                   benchmark the time to parse the on-disk markers for a repo
>     perflog       (no help text available)
>     perflookup    (no help text available)
> +   perflrucachedict
> +                 (no help text available)
>     perfmanifest  (no help text available)
>     perfmergecalculate
>                   (no help text available)
>     perfmoonwalk  benchmark walking the changelog backwards
>     perfnodelookup
>                   (no help text available)
>     perfparents   (no help text available)
>     perfpathcopies
> @@ -134,16 +136,21 @@ perfstatus
>    transaction abort!
>    rollback completed
>    $ hg perfheads 2>&1 | filter_perf_output
>    $ hg perfindex 2>&1 | filter_perf_output
>    $ hg perfloadmarkers 2>&1 | filter_perf_output
>    $ hg perflog 2>&1 | filter_perf_output
>    $ hg perflookup 2 2>&1 | filter_perf_output
>    ! result: 20
> +  $ hg perflrucache 2>&1 | filter_perf_output
> +  ! init
> +  ! gets
> +  ! sets
> +  ! mixed
>    $ hg perfmanifest 2 2>&1 | filter_perf_output
>    $ hg perfmergecalculate -r 3 2>&1 | filter_perf_output
>    $ hg perfmoonwalk 2>&1 | filter_perf_output
>    $ hg perfnodelookup 2 2>&1 | filter_perf_output
>    $ hg perfpathcopies 1 2 2>&1 | filter_perf_output
>    $ hg perfrawfiles 2 2>&1 | filter_perf_output
>    $ hg perfrevlog .hg/store/data/a.i 2>&1 | filter_perf_output
>    $ hg perfrevrange 2>&1 | filter_perf_output
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> https://selenic.com/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list