[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