Re: [PATCH] t/perf/perf-lib.sh: remove test_times.* at the end test_perf_()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 10/6/21 3:24 PM, Jeff King wrote:
On Tue, Oct 05, 2021 at 01:45:03PM -0400, Taylor Blau wrote:

GIT_PERF_REPEAT_COUNT=3 \
test_perf "status" "
	git status
"

GIT_PERF_REPEAT_COUNT=1 \
test_perf "checkout other" "
	git checkout other
"
[...]

Well explained, and makes sense to me. I didn't know we set
GIT_PERF_REPEAT_COUNT inline with the performance tests themselves, but
grepping shows that we do it in the fsmonitor tests.

Neither did I. IMHO that is a hack that we would do better to avoid, as
the point of it is to let the user drive the decision of time versus
quality of results. So the first example above is spending extra time
that the user may have asked us not to, and the second is getting less
significant results by not repeating the trial.

Presumably the issue in the second one is that the test modifies state.
The "right" solution there is to give test_perf() a way to set up the
state between trials (you can do it in the test_perf block, but you'd
want to avoid letting the setup step affect the timing).

I'd also note that

   GIT_PERF_REPEAT_COUNT=1 \
   test_perf ...

in the commit message is a bad pattern. On some shells, the one-shot
variable before a function will persist after the function returns (so
it would accidentally tweak the count for later tests, too).

All that said, I do think cleaning up the test_time files after each
test_perf is a good precuation, even if I don't think it's a good idea
in general to flip the REPEAT_COUNT variable in the middle of a test.

-Peff


Yeah, I don't think I want to keep switching the value of _REPEAT_COUNT
in the body of the test.  (It did feel a little "against the spirit" of
the framework.)  I'm in the process of redoing the test to not need
that.



There's a problem with the perf test assumptions here and I'm curious
if there's a better way to use the perf-lib that I'm not thinking of.

When working with big repos (in this case 100K files), the actual
checkout takes 33 seconds, but the repetitions are fast -- since they
just print a warning and stop.  In the 1M file case that number is ~7
minutes for the first instance.)  With the code in min_time.perl
silently taking the min() of the runs, it looks like the checkout was
really fast when it wasn't.  That fact gets hidden in the summary report
printed at the end.

$ time ~/work/core/git checkout p0006-ballast
Updating files: 100% (100000/100000), done.
Switched to branch 'p0006-ballast'

real	0m33.510s
user	0m2.757s
sys	0m15.565s

$ time ~/work/core/git checkout p0006-ballast
Already on 'p0006-ballast'

real	0m0.745s
user	0m0.214s
sys	0m4.705s

$ time ~/work/core/git checkout p0006-ballast
Already on 'p0006-ballast'

real	0m0.738s
user	0m0.134s
sys	0m6.850s


I could use test_expect_success() for anything that does want
to change state, and then save test_perf() for status calls
and other read-only tests, but I think we lose some opportunities
here.

I'm open to suggestions here.

Thanks,
Jeff




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux