Thanks for the review Mark! Sorry it took too long to reply on my side.

> 28 июня 2021 г., в 21:05, Mark Dilger <mark.dil...@enterprisedb.com> 
> написал(а):
> 
>> #define PGLZ_HISTORY_SIZE       0x0fff - 1  /* to avoid compare in iteration 
>> */
> ...
>> static PGLZ_HistEntry hist_entries[PGLZ_HISTORY_SIZE + 1];
> ...
>>    if (hist_next == PGLZ_HISTORY_SIZE + 1)
> 
> These are the only uses of PGLZ_HISTORY_SIZE.  Perhaps you could just defined 
> the symbol as 0x0fff and skip the -1 and +1 business?
Fixed.

>> /* ----------
>> * pglz_compare -
>> *
>> *      Compares 4 bytes at pointers
>> * ----------
>> */
>> static inline bool
>> pglz_compare32(const void *ptr1, const void *ptr2)
>> {
>>    return memcmp(ptr1, ptr2, 4) == 0;
>> }
> 
> The comment function name differs from the actual function name.
> 
> Also, pglz_compare returns an offset into the string, whereas pglz_compare32 
> returns a boolean.  This is fairly unintuitive.  The "32" part of 
> pglz_compare32 implies doing the same thing as pglz_compare but where the 
> string is known to be 4 bytes in length.  Given that pglz_compare32 is 
> dissimilar to pglz_compare, perhaps avoid using /pglz_compare/ in its name?
I've removed pglz_compare32 entirely. It was a simple substitution for memcmp().

> 
>>        /*
>>         * Determine length of match. A better match must be larger than the
>>         * best so far. And if we already have a match of 16 or more bytes,
>>         * it's worth the call overhead to use memcmp()
> 
> This comment is hard to understand, given the code that follows.  The first 
> block calls memcmp(), which seems to be the function overhead you refer to.  
> The second block calls the static inline function pglz_compare32, which 
> internally calls memcmp().  Superficially, there seems to be a memcmp() 
> function call either way.  The difference is that in the first block's call 
> to memcmp(), the length is a runtime value, and in the second block, it is a 
> compile-time known value.  If you are depending on the compiler to notice 
> this distinction and optimize the second call, perhaps you can mention that 
> explicitly?  Otherwise, reading and understanding the comment takes more 
> effort.
I've updated comment for second branch with fixed-size memcmp(). Frankly, I'm 
not sure "if (memcmp(input_pos, hist_pos, 4) == 0)" worth the complexity,  
internals of "pglz_compare(0, len_bound, input_pos + 0, hist_pos + 0);" would 
do almost same instructions.

> 
> I took a quick look for other places in the code that try to beat the 
> performance of memcmp on short strings.  In varlena.c, rest_of_char_same() 
> seems to do so.  We also use comparisons on NameData, which frequently 
> contains strings shorter than 16 bytes.  Is it worth sharting a static inline 
> function that uses your optimization in other places?  How confident are you 
> that your optimization really helps?
Honestly, I do not know. The overall patch effect consists of stacking up many 
small optimizations. They have a net effect, but are too noisy to measure 
independently. That's mostly the reason why I didn't know what to reply for so 
long.


> 5 нояб. 2021 г., в 01:47, Tomas Vondra <tomas.von...@enterprisedb.com> 
> написал(а):
> 
> Andrey, can you update the patch per Mark's review? I'll do my best to get it 
> committed sometime in this CF.

Cool! Here's the patch.

Best regards, Andrey Borodin.

Attachment: v6-0001-Reorganize-pglz-compression-code.patch
Description: Binary data

Reply via email to