diff -r 78ac56aebab6 -r 168ef0a4eb3b contrib/perf.py --- a/contrib/perf.py Mon Jan 02 11:22:52 2017 -0800 +++ b/contrib/perf.py Mon Jan 02 12:02:08 2017 -0800 @@ -859,9 +859,10 @@ fm.end() @command('perfrevlogchunks', revlogopts + formatteropts + - [('s', 'startrev', 0, 'revision to start at')], + [('e', 'engines', '', 'compression engines to use'), + ('s', 'startrev', 0, 'revision to start at')], '-c|-m|FILE') -def perfrevlogchunks(ui, repo, file_=None, startrev=0, **opts): +def perfrevlogchunks(ui, repo, file_=None, engines=None, startrev=0, **opts): """Benchmark operations on revlog chunks. Logically, each revlog is a collection of fulltext revisions. However, @@ -874,6 +875,26 @@ see ``perfrevlog`` and ``perfrevlogrevision``. """ rl = cmdutil.openrevlog(repo, 'perfrevlogchunks', file_, opts) + + # Verify engines argument. + if engines: + engines = set(e.strip() for e in engines.split(',')) + for engine in engines: + try: + util.compressionengines[engine] + except KeyError: + raise error.Abort('unknown compression engine: %s' % engine) + else: + engines = [] + for e in util.compengines: + engine = util.compengines[e] + try: + if engine.available(): + engine.revlogcompressor().compress('dummy') + engines.append(e) + except NotImplementedError: + pass + revs = list(rl.revs(startrev, len(rl) - 1)) def rlfh(rl): @@ -916,10 +937,17 @@ # Save chunks as a side-effect. chunks[0] = rl._chunks(revs, df=fh) - def docompress(): + def docompress(compressor): rl.clearcaches() - for chunk in chunks[0]: - rl.compress(chunk) + + try: + # Swap in the requested compression engine. + oldcompressor = rl._compressor + rl._compressor = compressor + for chunk in chunks[0]: + rl.compress(chunk) + finally: + rl._compressor = oldcompressor benches = [ (lambda: doread(), 'read'), @@ -928,9 +956,13 @@ (lambda: doreadbatchcachedfh(), 'read batch w/ reused fd'), (lambda: dochunk(), 'chunk'), (lambda: dochunkbatch(), 'chunk batch'), - (lambda: docompress(), 'compress'), ] + for engine in sorted(engines): + compressor = util.compengines[engine].revlogcompressor() + benches.append((functools.partial(docompress, compressor), + 'compress w/ %s' % engine)) + for fn, title in benches: timer, fm = gettimer(ui, opts) timer(fn, title=title)