spatchcache: add a ccache-alike for "spatch"
commit6fae3aaf22ad3929ed86b5f83ec0deaa9e2d028c
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Tue, 1 Nov 2022 22:35:55 +0000 (1 23:35 +0100)
committerTaylor Blau <me@ttaylorr.com>
Thu, 3 Nov 2022 01:22:16 +0000 (2 21:22 -0400)
tree38f6ac62d94813a759a19c2f28213f8d83f18d0a
parentd0e624aed736083e5a97cf78fa15b498758e1e7b
spatchcache: add a ccache-alike for "spatch"

Add a rather trivial "spatchcache", with this running e.g.:

make cocciclean
make contrib/coccinelle/free.cocci.patch \
SPATCH=contrib/coccicheck/spatchcache \
SPATCH_FLAGS=--very-quiet

Is cut down from ~20s to ~5s on my system. Much of that is either
fixable shell overhead, or the around 40 files we "CANTCACHE" (see the
implementation).

This uses "redis" as a cache by default, but it's configurable. See
the embedded documentation.

This is *not* like ccache in that we won't cache failed spatch
invocations, or those where spatch suggests changes for us. Those
cases are so rare that I didn't think it was worth the bother, by far
the most common case is that it has no suggested changes. We'll also
refuse to cache any "spatch" invocation that has output on stderr,
which means that "--very-quiet" must be added to "SPATCH_FLAGS".

Because we narrow the cache to that we don't need to save away stdout,
stderr & the exit code. We simply cache the cases where we had no
suggested changes.

Another benchmark is to compare this with the previous
SPATCH_BATCH_SIZE=N, as noted in [1]. Before this (on my 8 core system) running:

make clean; time make contrib/coccinelle/array.cocci.patch SPATCH_BATCH_SIZE=0

Would take 33s, but with the preceding changes running without this
"spatchcache" is slightly slower, or around 35s:

make clean; time make contrib/coccinelle/array.cocci.patch

Now doing the same with SPATCH=contrib/coccinelle/spatchcache will
take around 6s, but we'll need to compile the *.o files first to take
full advantage of it (which can be fast with "ccache"):

make clean; make; time make contrib/coccinelle/array.cocci.patch SPATCH=contrib/coccinelle/spatchcache

1. https://lore.kernel.org/git/YwdRqP1CyUAzCEn2@coredump.intra.peff.net/

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
contrib/coccinelle/README
contrib/coccinelle/spatchcache [new file with mode: 0755]