libkmod: improve realloc behavior for zstd outbuffer

The allocator in glibc has a particular quirk that successive
reallocs on the same pointer are cheap, at the cost of excess
memory fragmentation. Other allocators generally do not do this,
so excessive reallocs become relatively expensive.

Reducing the number of reallocations by using a more agressive
strategy for buffer size increase makes performance better on
those setups, e.g. musl libc, or generally any other allocator;
on my Chimera Linux setup with Scudo allocator (LLVM) it doubles
to triples the performance of running e.g. depmod.

Signed-off-by: q66 <q66@chimera-linux.org>
Signed-off-by: Lucas De Marchi <lucas.de.marchi@gmail.com>
This commit is contained in:
q66 2024-06-18 01:22:06 +02:00 committed by Lucas De Marchi
parent a6f070b3e1
commit 8da7c1e088

View File

@ -89,7 +89,11 @@ static int zstd_ensure_outbuffer_space(ZSTD_outBuffer *buffer, size_t min_free)
if (buffer->size - buffer->pos >= min_free)
return 0;
buffer->size += min_free;
if (buffer->size < min_free)
buffer->size = min_free;
else
buffer->size *= 2;
buffer->dst = realloc(buffer->dst, buffer->size);
if (buffer->dst == NULL) {
ret = -errno;