test-profile.t
194 lines
| 5.0 KiB
| text/troff
|
Tads3Lexer
/ tests / test-profile.t
Matt Mackall
|
r12478 | test --time | ||
Martin Geisler
|
r16933 | $ hg --time help -q help 2>&1 | grep time > /dev/null | ||
Matt Mackall
|
r12478 | $ hg init a | ||
$ cd a | ||||
Martin von Zweigbergk
|
r33611 | Function to check that statprof ran | ||
$ statprofran () { | ||||
Mads Kiilerich
|
r51618 | > grep -E 'Sample count:|No samples recorded' > /dev/null | ||
Martin von Zweigbergk
|
r33611 | > } | ||
Mads Kiilerich
|
r16898 | |||
Matt Mackall
|
r12478 | test --profile | ||
Martin von Zweigbergk
|
r33611 | $ hg st --profile 2>&1 | statprofran | ||
r32787 | ||||
Abreviated version | ||||
Martin von Zweigbergk
|
r33611 | $ hg st --prof 2>&1 | statprofran | ||
r32787 | ||||
In alias | ||||
Martin von Zweigbergk
|
r33611 | $ hg --config "alias.profst=status --profile" profst 2>&1 | statprofran | ||
r32787 | ||||
#if lsprof | ||||
Raphaël Gomès
|
r48362 | $ prof () { | ||
> hg --config profiling.type=ls --profile $@ | ||||
> } | ||||
Gregory Szorc
|
r30259 | |||
Raphaël Gomès
|
r48362 | $ prof st 2>../out | ||
Mads Kiilerich
|
r16898 | $ grep CallCount ../out > /dev/null || cat ../out | ||
Raphaël Gomès
|
r48362 | $ prof --config profiling.output=../out st | ||
Mads Kiilerich
|
r16898 | $ grep CallCount ../out > /dev/null || cat ../out | ||
Raphaël Gomès
|
r48362 | $ prof --config profiling.output=blackbox --config extensions.blackbox= st | ||
Durham Goode
|
r26191 | $ grep CallCount .hg/blackbox.log > /dev/null || cat .hg/blackbox.log | ||
Raphaël Gomès
|
r48362 | $ prof --config profiling.format=text st 2>../out | ||
Mads Kiilerich
|
r16898 | $ grep CallCount ../out > /dev/null || cat ../out | ||
$ echo "[profiling]" >> $HGRCPATH | ||||
$ echo "format=kcachegrind" >> $HGRCPATH | ||||
Raphaël Gomès
|
r48362 | $ prof st 2>../out | ||
Mads Kiilerich
|
r16898 | $ grep 'events: Ticks' ../out > /dev/null || cat ../out | ||
Raphaël Gomès
|
r48362 | $ prof --config profiling.output=../out st | ||
Mads Kiilerich
|
r16898 | $ grep 'events: Ticks' ../out > /dev/null || cat ../out | ||
#endif | ||||
Mads Kiilerich
|
r16913 | |||
r52734 | #if serve | |||
Gregory Szorc
|
r29787 | |||
Profiling of HTTP requests works | ||||
r52734 | $ stats_prof () { | |||
> hg --config profiling.type=stat --profile $@ | ||||
> } | ||||
$ stats_prof \ | ||||
r52732 | > --config profiling.format=text \ | |||
> --config profiling.output=../profile.log \ | ||||
> serve -d \ | ||||
> -p $HGPORT \ | ||||
> --pid-file ../hg.pid \ | ||||
> -A ../access.log \ | ||||
> --errorlog ../error.log | ||||
Gregory Szorc
|
r29787 | $ cat ../hg.pid >> $DAEMON_PIDS | ||
$ hg -q clone -U http://localhost:$HGPORT ../clone | ||||
r52732 | $ cat ../error.log | |||
Gregory Szorc
|
r29787 | |||
A single profile is logged because file logging doesn't append | ||||
r52734 | $ grep 'Sample count:' ../profile.log | wc -l | |||
\s*1 (re) | ||||
$ grep 'Total time:' ../profile.log | wc -l | ||||
Gregory Szorc
|
r29787 | \s*1 (re) | ||
#endif | ||||
Gregory Szorc
|
r30316 | Install an extension that can sleep and guarantee a profiler has time to run | ||
Kyle Lippincott
|
r46639 | $ cat >> sleepext_with_a_long_filename.py << EOF | ||
Gregory Szorc
|
r30316 | > import time | ||
Matt Harbison
|
r40405 | > from mercurial import registrar | ||
Gregory Szorc
|
r30316 | > cmdtable = {} | ||
Yuya Nishihara
|
r32337 | > command = registrar.command(cmdtable) | ||
Pulkit Goyal
|
r38086 | > @command(b'sleep', [], b'hg sleep') | ||
Kyle Lippincott
|
r46639 | > def sleep_for_at_least_one_stat_cycle(ui, *args, **kwargs): | ||
Raphaël Gomès
|
r48363 | > t = time.time() # don't use time.sleep because we need CPU time | ||
> while time.time() - t < 0.5: | ||||
> pass | ||||
Gregory Szorc
|
r30316 | > EOF | ||
$ cat >> $HGRCPATH << EOF | ||||
> [extensions] | ||||
Kyle Lippincott
|
r46639 | > sleep = `pwd`/sleepext_with_a_long_filename.py | ||
Gregory Szorc
|
r30316 | > EOF | ||
statistical profiler works | ||||
Gregory Szorc
|
r30317 | $ hg --profile sleep 2>../out | ||
Martin von Zweigbergk
|
r33611 | $ cat ../out | statprofran | ||
Gregory Szorc
|
r30316 | |||
Various statprof formatters work | ||||
Augie Fackler
|
r40517 | $ hg --profile --config profiling.statformat=byline sleep 2>../out || cat ../out | ||
r46208 | $ grep -v _path_stat ../out | head -n 3 | |||
Gregory Szorc
|
r30316 | % cumulative self | ||
Pulkit Goyal
|
r40417 | time seconds seconds name | ||
Kyle Lippincott
|
r46639 | * sleepext_with_a_long_filename.py:*:sleep_for_at_least_one_stat_cycle (glob) | ||
Martin von Zweigbergk
|
r33611 | $ cat ../out | statprofran | ||
Gregory Szorc
|
r30316 | |||
Augie Fackler
|
r40517 | $ hg --profile --config profiling.statformat=bymethod sleep 2>../out || cat ../out | ||
Gregory Szorc
|
r30316 | $ head -n 1 ../out | ||
% cumulative self | ||||
Martin von Zweigbergk
|
r33611 | $ cat ../out | statprofran | ||
Gregory Szorc
|
r30316 | |||
Raphaël Gomès
|
r48363 | Windows real time tracking is broken, only use CPU | ||
#if no-windows | ||||
$ hg --profile --config profiling.time-track=real --config profiling.statformat=hotpath sleep 2>../out || cat ../out | ||||
Martin von Zweigbergk
|
r33611 | $ cat ../out | statprofran | ||
Raphaël Gomès
|
r48363 | $ grep sleepext_with_a_long_filename.py ../out | head -n 1 | ||
.* [0-9.]+% [0-9.]+s sleepext_with_a_long_filename.py:\s*sleep_for_at_least_one_stat_cycle, line \d+:\s+(while|pass).* (re) | ||||
#endif | ||||
$ hg --profile --config profiling.time-track=cpu --config profiling.statformat=hotpath sleep 2>../out || cat ../out | ||||
$ cat ../out | statprofran | ||||
$ grep sleepext_with_a_long_filename.py ../out | head -n 1 | ||||
.* [0-9.]+% [0-9.]+s sleepext_with_a_long_filename.py:\s*sleep_for_at_least_one_stat_cycle, line \d+:\s+(while|pass).* (re) | ||||
Gregory Szorc
|
r30316 | |||
Augie Fackler
|
r40517 | $ hg --profile --config profiling.statformat=json sleep 2>../out || cat ../out | ||
Gregory Szorc
|
r30316 | $ cat ../out | ||
Yuya Nishihara
|
r32060 | \[\[-?\d+.* (re) | ||
Gregory Szorc
|
r30316 | |||
Gregory Szorc
|
r30845 | statprof can be used as a standalone module | ||
Matt Harbison
|
r39743 | $ "$PYTHON" -m mercurial.statprof hotpath | ||
Gregory Szorc
|
r30845 | must specify --file to load | ||
[1] | ||||
Mads Kiilerich
|
r16913 | $ cd .. | ||
Jun Wu
|
r32417 | |||
Jun Wu
|
r34446 | #if no-chg | ||
Jun Wu
|
r32417 | profiler extension could be loaded before other extensions | ||
$ cat > fooprof.py <<EOF | ||||
> import contextlib | ||||
Gregory Szorc
|
r40236 | > import sys | ||
Jun Wu
|
r32417 | > @contextlib.contextmanager | ||
> def profile(ui, fp): | ||||
> print('fooprof: start profile') | ||||
Gregory Szorc
|
r40236 | > sys.stdout.flush() | ||
Jun Wu
|
r32417 | > yield | ||
> print('fooprof: end profile') | ||||
Gregory Szorc
|
r40236 | > sys.stdout.flush() | ||
Jun Wu
|
r32417 | > def extsetup(ui): | ||
Pulkit Goyal
|
r38086 | > ui.write(b'fooprof: loaded\n') | ||
Jun Wu
|
r32417 | > EOF | ||
$ cat > otherextension.py <<EOF | ||||
> def extsetup(ui): | ||||
Pulkit Goyal
|
r38086 | > ui.write(b'otherextension: loaded\n') | ||
Jun Wu
|
r32417 | > EOF | ||
$ hg init b | ||||
$ cd b | ||||
$ cat >> .hg/hgrc <<EOF | ||||
> [extensions] | ||||
> other = $TESTTMP/otherextension.py | ||||
> fooprof = $TESTTMP/fooprof.py | ||||
> EOF | ||||
$ hg root | ||||
otherextension: loaded | ||||
fooprof: loaded | ||||
Matt Harbison
|
r35394 | $TESTTMP/b | ||
Jun Wu
|
r32417 | $ HGPROF=fooprof hg root --profile | ||
fooprof: loaded | ||||
fooprof: start profile | ||||
otherextension: loaded | ||||
Matt Harbison
|
r35394 | $TESTTMP/b | ||
Jun Wu
|
r32417 | fooprof: end profile | ||
$ HGPROF=other hg root --profile 2>&1 | head -n 2 | ||||
otherextension: loaded | ||||
unrecognized profiler 'other' - ignored | ||||
$ HGPROF=unknown hg root --profile 2>&1 | head -n 1 | ||||
unrecognized profiler 'unknown' - ignored | ||||
$ cd .. | ||||
Jun Wu
|
r34446 | #endif | ||