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
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