From ffe50d5901a8f9e76200abf2c6ef43e250cc25f7 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@gmail.com>
Date: Mon, 17 Aug 2020 20:59:32 +1200
Subject: [PATCH 2/2] Use specialized sort in compactify_tuples().

Micro-optimization:  by using a sort function with inlined comparison
and size we can improve page compaction performance.
---
 src/backend/storage/page/bufpage.c | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c
index d708117a40..33d783e5f6 100644
--- a/src/backend/storage/page/bufpage.c
+++ b/src/backend/storage/page/bufpage.c
@@ -421,13 +421,17 @@ typedef struct itemIdSortData
 } itemIdSortData;
 typedef itemIdSortData *itemIdSort;
 
-static int
-itemoffcompare(const void *itemidp1, const void *itemidp2)
-{
-	/* Sort in decreasing itemoff order */
-	return ((itemIdSort) itemidp2)->itemoff -
-		((itemIdSort) itemidp1)->itemoff;
-}
+/*
+ * Instantiate a fast itemid_sort() function that sorts in decreasing offset
+ * order.
+ */
+#define SA_PREFIX itemid
+#define SA_ELEMENT_TYPE itemIdSortData
+#define SA_DEFINE
+#define SA_SCOPE static
+#define SA_ENABLE_SORT
+#define SA_COMPARE(a, b) ((b)->itemoff - (a)->itemoff)
+#include "lib/sort_utils.h"
 
 /*
  * After removing or marking some line pointers unused, move the tuples to
@@ -441,8 +445,7 @@ compactify_tuples(itemIdSort itemidbase, int nitems, Page page)
 	int			i;
 
 	/* sort itemIdSortData array into decreasing itemoff order */
-	qsort((char *) itemidbase, nitems, sizeof(itemIdSortData),
-		  itemoffcompare);
+	itemid_sort(itemidbase, nitems);
 
 	upper = phdr->pd_special;
 	for (i = 0; i < nitems; i++)
-- 
2.20.1

