> On Feb 25, 2026, at 14:31, yangyz <[email protected]> wrote:
> 
> Hi Hackers,
> 
> When I read the FindStreamingStart function in pg_receivewal.c, I discovered 
> an unnecessary use of memset.So I removed it, optimizing the performance 
> without affecting its functionality.
> 
> The following is the detailed analysis of the reasons:
> 1.LZ4F_decompress will fully overwrite the output buffer:
> When out_size is passed as an input parameter, it denotes the size of the 
> output buffer (outbuf). The decompression operation writes the decompressed 
> data to outbuf. Upon function return, out_size is updated to reflect the 
> actual number of bytes written. Notably, even in cases of partial 
> decompression, data is written starting from the initial position of outbuf.
> 2.Performance Overhead
> In each iteration, the entire buffer of size LZ4_CHUNK_SZ (potentially 
> several megabytes) is zero-initialized. Since these memory blocks are 
> immediately overwritten by decompressed data, this zeroing operation 
> constitutes an unnecessary consumption of CPU resources.
> 
> Regards,
> Yang Yuanzhuo
> 
> 
> 
> <v1-0001-Removed-an-unnecessary-use-of-memset-in-FindStrea.patch>

Looking at the code snippet:
```
        while (readp < readend)
        {
                size_t          out_size = LZ4_CHUNK_SZ;
                size_t          read_size = readend - readp;

                memset(outbuf, 0, LZ4_CHUNK_SZ);
                status = LZ4F_decompress(ctx, outbuf, &out_size,
                                                                 readp, 
&read_size, &dec_opt);
                if (LZ4F_isError(status))
                        pg_fatal("could not decompress file \"%s\": %s",
                                         fullpath,
                                         LZ4F_getErrorName(status));

                readp += read_size;
                uncompressed_size += out_size;
        }
```
It’s trying to locate the start position, and the decoded bytes are not 
consumed (they’re effectively discarded). Given that LZ4F_decompress() reports 
the produced size via out_size, zeroing the whole output buffer beforehand 
doesn’t seem necessary here. Since this happens inside the loop, the extra 
memset() just amplifies the overhead.

Also, ReadDataFromArchiveLZ4() has a very similar loop that doesn’t zero the 
output buffer at all:
```
        while (readp < readend)
        {
                size_t          out_size = DEFAULT_IO_BUFFER_SIZE;
                size_t          read_size = readend - readp;

                status = LZ4F_decompress(ctx, outbuf, &out_size,
                                                                 readp, 
&read_size, &dec_opt);
                if (LZ4F_isError(status))
                        pg_fatal("could not decompress: %s",
                                         LZ4F_getErrorName(status));

                ahwrite(outbuf, 1, out_size, AH);
                readp += read_size;
        }
```

So +1 for removing the memset.

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/






Reply via email to