v28-0009-Speed-up-tidstore_iter_extract_tids.patch

text/x-patch

Filename: v28-0009-Speed-up-tidstore_iter_extract_tids.patch
Type: text/x-patch
Part: 7
Message: Re: [PoC] Improve dead tuple storage for lazy vacuum

Patch

Format: format-patch
Series: patch v28-0009
Subject: Speed up tidstore_iter_extract_tids()
File+
src/backend/access/common/tidstore.c 5 5
From 8ccc66211973bcc44a6bad45c05302ca743c1489 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
Date: Tue, 14 Feb 2023 17:53:37 +0700
Subject: [PATCH v28 09/10] Speed up tidstore_iter_extract_tids()

---
 src/backend/access/common/tidstore.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/backend/access/common/tidstore.c b/src/backend/access/common/tidstore.c
index d1b4675ea4..5a897c01f7 100644
--- a/src/backend/access/common/tidstore.c
+++ b/src/backend/access/common/tidstore.c
@@ -632,21 +632,21 @@ tidstore_iter_extract_tids(TidStoreIter *iter, uint64 key, uint64 val)
 {
 	TidStoreIterResult *result = (&iter->result);
 
-	for (int i = 0; i < sizeof(uint64) * BITS_PER_BYTE; i++)
+	while (val)
 	{
 		uint64	tid_i;
 		OffsetNumber	off;
 
-		if ((val & (UINT64CONST(1) << i)) == 0)
-			continue;
-
 		tid_i = key << TIDSTORE_VALUE_NBITS;
-		tid_i |= i;
+		tid_i |= pg_rightmost_one_pos64(val);
 
 		off = tid_i & ((UINT64CONST(1) << iter->ts->control->offset_nbits) - 1);
 
 		Assert(result->num_offsets < iter->ts->control->max_offset);
 		result->offsets[result->num_offsets++] = off;
+
+		/* unset the rightmost bit */
+		val &= ~pg_rightmost_one64(val);
 	}
 
 	result->blkno = key_get_blkno(iter->ts, key);
-- 
2.39.1