perf-test: add option to run perf

Although the generation of perf data is not as slow as valgrind, it
seems simplest to re-use the machinery already there to save the logs
in a timestamped subdirectory.
This commit is contained in:
David Bremner 2021-04-25 12:23:52 -03:00
parent 9e2e723881
commit 6a20478abb
2 changed files with 45 additions and 5 deletions

View file

@ -16,6 +16,7 @@ In addition to having notmuch, you need:
- xz. Some speedup can be gotten by installing "pixz", but this is - xz. Some speedup can be gotten by installing "pixz", but this is
probably only worthwhile if you are debugging the tests. probably only worthwhile if you are debugging the tests.
- valgrind (for the memory tests) - valgrind (for the memory tests)
- perf (optional, for more fine-grained timing)
Getting set up to run tests: Getting set up to run tests:
---------------------------- ----------------------------
@ -57,10 +58,23 @@ supports the following arguments
--small / --medium / --large Choose corpus size. --small / --medium / --large Choose corpus size.
--debug Enable debugging. In particular don't delete --debug Enable debugging. In particular don't delete
temporary directories. temporary directories.
--perf Run perf record in place of /usr/bin/time. Perf output can be
found in a log directory.
--call-graph {fp,lbr,dwarf} Call graph option for perf record. Default is 'lbr'.
When using the make targets, you can pass arguments to all test When using the make targets, you can pass arguments to all test
scripts by defining the make variable OPTIONS. scripts by defining the make variable OPTIONS.
Log Directory
-------------
The memory tests, and the time tests when option '--perf' is given
save their output in a directory named as follows
log.$test_name-$corpus_size-$timestamp
These directories are removed by "make clean".
Writing tests Writing tests
------------- -------------

View file

@ -1,6 +1,9 @@
. $(dirname "$0")/version.sh || exit 1 . $(dirname "$0")/version.sh || exit 1
debug=""
corpus_size=large corpus_size=large
perf_callgraph=lbr
use_perf=0
while test "$#" -ne 0 while test "$#" -ne 0
do do
@ -9,6 +12,15 @@ do
debug=t; debug=t;
shift shift
;; ;;
-p|--perf)
use_perf=1;
shift
;;
-c|--call-graph)
shift
perf_callgraph=$1
shift
;;
-s|--small) -s|--small)
corpus_size=small; corpus_size=small;
shift shift
@ -127,10 +139,20 @@ notmuch_new_with_cache ()
fi fi
} }
make_log_dir () {
local timestamp=$(date +%Y%m%dT%H%M%S)
log_dir=${TEST_DIRECTORY}/log.$(basename $0)-$corpus_size-${timestamp}
mkdir -p "${log_dir}"
}
time_start () time_start ()
{ {
add_email_corpus add_email_corpus
if [[ "$use_perf" = 1 ]]; then
make_log_dir
fi
print_header print_header
notmuch_new_with_cache time_run notmuch_new_with_cache time_run
@ -140,9 +162,7 @@ memory_start ()
{ {
add_email_corpus add_email_corpus
local timestamp=$(date +%Y%m%dT%H%M%S) make_log_dir
log_dir="${TEST_DIRECTORY}/log.$(basename $0)-$corpus_size-${timestamp}"
mkdir -p ${log_dir}
notmuch_new_with_cache memory_run notmuch_new_with_cache memory_run
} }
@ -193,7 +213,13 @@ time_run ()
printf " %-22s" "$1" printf " %-22s" "$1"
test_count=$(($test_count+1)) test_count=$(($test_count+1))
if test "$verbose" != "t"; then exec 4>test.output 3>&4; fi if test "$verbose" != "t"; then exec 4>test.output 3>&4; fi
if ! eval >&3 "/usr/bin/time -f '%e\t%U\t%S\t%M\t%I/%O' $2" ; then if [[ "$use_perf" = 1 ]]; then
command_str="perf record --call-graph=${perf_callgraph} -o ${log_dir}/${test_count}.perf $2"
else
command_str="/usr/bin/time -f '%e\t%U\t%S\t%M\t%I/%O' $2"
fi
if ! eval >&3 "$command_str" ; then
test_failure=$(($test_failure + 1)) test_failure=$(($test_failure + 1))
return 1 return 1
fi fi