On Fri, Sep 26, 2014 at 3:26 PM, Andres Freund <and...@2ndquadrant.com> wrote: > Neither, really. The hash calculation is visible in the profile, but not > that pronounced yet. The primary thing noticeable in profiles (besides > cache efficiency) is the comparison of the full tag after locating a > possible match in a bucket. 20 byte memcmp's aren't free.
I'm not arguing against a more efficient hash table, but one simple win would be to have a buffer tag specific comparison function. I mean something like the attached patch. This way we avoid the loop counter overhead, can check the blocknum first and possibly have better branch prediction. Do you have a workload where I could test if this helps alleviate the comparison overhead? Regards, Ants Aasma -- Cybertec Schönig & Schönig GmbH Gröhrmühlgasse 26 A-2700 Wiener Neustadt Web: http://www.postgresql-support.de
diff --git a/src/backend/storage/buffer/buf_table.c b/src/backend/storage/buffer/buf_table.c index 7a38f2f..ba37b5f 100644 --- a/src/backend/storage/buffer/buf_table.c +++ b/src/backend/storage/buffer/buf_table.c @@ -34,6 +34,7 @@ typedef struct static HTAB *SharedBufHash; +static int BufTableCmpBufferTag(BufferTag *a, BufferTag *b, int n); /* * Estimate space needed for mapping hashtable @@ -46,6 +47,19 @@ BufTableShmemSize(int size) } /* + * Compare contents of two buffer tags. We use this instead of the default + * memcmp to minimize comparison overhead. + */ +static int +BufTableCmpBufferTag(BufferTag *a, BufferTag *b, int n) +{ + Assert(offsetof(BufferTag, blockNum) == 2*sizeof(uint64)); + return (a->blockNum == b->blockNum + && ((uint64*)a)[0] == ((uint64*)b)[0] + && ((uint64*)a)[1] == ((uint64*)b)[1]) ? 0 : 1; +} + +/* * Initialize shmem hash table for mapping buffers * size is the desired hash table size (possibly more than NBuffers) */ @@ -61,6 +75,7 @@ InitBufTable(int size) info.entrysize = sizeof(BufferLookupEnt); info.hash = tag_hash; info.num_partitions = NUM_BUFFER_PARTITIONS; + info.match = BufTableCmpBufferTag; SharedBufHash = ShmemInitHash("Shared Buffer Lookup Table", size, size,
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers