##// END OF EJS Templates
revlog: add a small cache of unfiltered chunk...
revlog: add a small cache of unfiltered chunk This can provides a massive boost to the reading of multiple revision and the computation of a valid delta chain. This greatly help operation like `hg log --patch`, delta computation (helping pull/unbundle), linkrev adjustment (helping copy tracing). A first round of benchmark for `hg log --patch --limit 1000` shows improvement in the 10-20% range on "small" repository like pypy or mercurial and large improvements (about 33%) for more complex ones like netbeans and mozilla's. These speeds up are consistent with the improvement to `hg pull` (from a server sending poor deltas) I saw benchmarking this last year. Further benchmark will be run during the freeze. I added some configuration in the experimental space to be able to further test the effect of various tuning for now. This feature should fit well in the "usage/resource profile" configuration that we should land next cycle. When it does not provides a benefit the overhead of the cache seem to be around 2%, a small price for the big improvement. In addition I believe we could shave most of this overhead with a more efficent lru implementation.

File last commit:

r49730:6000f5b2 default
r52001:0250e450 default
Show More
catapipe.py
120 lines | 3.5 KiB | text/x-python | PythonLexer
Augie Fackler
contrib: new script to read events from a named pipe and emit catapult traces...
r39288 #!/usr/bin/env python3
#
# Copyright 2018 Google LLC.
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
"""Tool read primitive events from a pipe to produce a catapult trace.
Kyle Lippincott
catapult: add a bit more documentation on how to use catapult tracing...
r40526 Usage:
Terminal 1: $ catapipe.py /tmp/mypipe /tmp/trace.json
Terminal 2: $ HGCATAPULTSERVERPIPE=/tmp/mypipe hg root
<ctrl-c catapipe.py in Terminal 1>
$ catapult/tracing/bin/trace2html /tmp/trace.json # produce /tmp/trace.html
<open trace.html in your browser of choice; the WASD keys are very useful>
(catapult is located at https://github.com/catapult-project/catapult)
Augie Fackler
contrib: new script to read events from a named pipe and emit catapult traces...
r39288 For now the event stream supports
START $SESSIONID ...
and
END $SESSIONID ...
events. Everything after the SESSIONID (which must not contain spaces)
is used as a label for the event. Events are timestamped as of when
they arrive in this process and are then used to produce catapult
traces that can be loaded in Chrome's about:tracing utility. It's
important that the event stream *into* this process stay simple,
because we have to emit it from the shell scripts produced by
run-tests.py.
Typically you'll want to place the path to the named pipe in the
HGCATAPULTSERVERPIPE environment variable, which both run-tests and hg
Kyle Lippincott
catapult: add a bit more documentation on how to use catapult tracing...
r40526 understand. To trace *only* run-tests, use HGTESTCATAPULTSERVERPIPE instead.
Augie Fackler
contrib: new script to read events from a named pipe and emit catapult traces...
r39288 """
import argparse
import json
import os
Boris Feld
contrib: use a monotonic timer in catapipe...
r39550 import timeit
Augie Fackler
contrib: new script to read events from a named pipe and emit catapult traces...
r39288
_TYPEMAP = {
'START': 'B',
'END': 'E',
Augie Fackler
catapipe: add support for COUNTER events...
r42675 'COUNTER': 'C',
Augie Fackler
contrib: new script to read events from a named pipe and emit catapult traces...
r39288 }
_threadmap = {}
Boris Feld
contrib: use a monotonic timer in catapipe...
r39550 # Timeit already contains the whole logic about which timer to use based on
# Python version and OS
timer = timeit.default_timer
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
contrib: new script to read events from a named pipe and emit catapult traces...
r39288 def main():
parser = argparse.ArgumentParser()
Augie Fackler
formatting: blacken the codebase...
r43346 parser.add_argument(
'pipe',
type=str,
nargs=1,
help='Path of named pipe to create and listen on.',
)
parser.add_argument(
'output',
default='trace.json',
type=str,
nargs='?',
help='Path of json file to create where the traces ' 'will be stored.',
)
parser.add_argument(
'--debug',
default=False,
action='store_true',
help='Print useful debug messages',
)
Augie Fackler
contrib: new script to read events from a named pipe and emit catapult traces...
r39288 args = parser.parse_args()
fn = args.pipe[0]
os.mkfifo(fn)
try:
with open(fn) as f, open(args.output, 'w') as out:
out.write('[\n')
Boris Feld
contrib: use a monotonic timer in catapipe...
r39550 start = timer()
Augie Fackler
contrib: new script to read events from a named pipe and emit catapult traces...
r39288 while True:
ev = f.readline().strip()
if not ev:
continue
Boris Feld
contrib: use a monotonic timer in catapipe...
r39550 now = timer()
Augie Fackler
contrib: new script to read events from a named pipe and emit catapult traces...
r39288 if args.debug:
print(ev)
verb, session, label = ev.split(' ', 2)
if session not in _threadmap:
_threadmap[session] = len(_threadmap)
Augie Fackler
catapipe: add support for COUNTER events...
r42675 if verb == 'COUNTER':
amount, label = label.split(' ', 1)
payload_args = {'value': int(amount)}
else:
payload_args = {}
Augie Fackler
contrib: new script to read events from a named pipe and emit catapult traces...
r39288 pid = _threadmap[session]
Augie Fackler
catapipe: fix bug introduced when switching to the timer api...
r39971 ts_micros = (now - start) * 1000000
Augie Fackler
formatting: blacken the codebase...
r43346 out.write(
json.dumps(
{
"name": label,
"cat": "misc",
"ph": _TYPEMAP[verb],
"ts": ts_micros,
"pid": pid,
"tid": 1,
"args": payload_args,
}
)
)
Augie Fackler
contrib: new script to read events from a named pipe and emit catapult traces...
r39288 out.write(',\n')
finally:
os.unlink(fn)
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
contrib: new script to read events from a named pipe and emit catapult traces...
r39288 if __name__ == '__main__':
main()