v42-0002-Optimized-Oid-List-Sorting-by-using-template-sor.patch
text/x-patch
Filename: v42-0002-Optimized-Oid-List-Sorting-by-using-template-sor.patch
Type: text/x-patch
Part: 1
Patch
Format: format-patch
Series: patch v42-0002
Subject: Optimized Oid List Sorting by using template sorting algorithm
| File | + | − |
|---|---|---|
| src/backend/nodes/list.c | 14 | 0 |
| src/include/nodes/pg_list.h | 1 | 0 |
From 32f967a10a2dd6a9f68aa85717ab11ab83f03298 Mon Sep 17 00:00:00 2001
From: Stepan Neretin <sncfmgg@gmail.com>
Date: Sat, 8 Jun 2024 00:04:42 +0700
Subject: [PATCH v42 2/6] Optimized Oid List Sorting by using template sorting
algorithm
Optimized the sorting of lists containing Oids by utilizing a custom sort template. This enhancement introduces a specialized sorting function sort_list_oids defined through macros and included from sort_template.h. The new function improves performance by directly comparing Oids and sorting the list in-place.
Changes:
- Defined ST_SORT, ST_ELEMENT_TYPE, ST_COMPARE, ST_SCOPE, and ST_DEFINE macros for sort_list_oids.
- Included sort_template.h to leverage the template-based sorting mechanism.
- Implemented list_oid_sort function to sort lists with Oid type.
This optimization is expected to provide better sorting efficiency for lists containing Oids, contributing to overall system performance improvements.
---
src/backend/nodes/list.c | 14 ++++++++++++++
src/include/nodes/pg_list.h | 1 +
2 files changed, 15 insertions(+)
diff --git a/src/backend/nodes/list.c b/src/backend/nodes/list.c
index e2615ab105..e10ce545ad 100644
--- a/src/backend/nodes/list.c
+++ b/src/backend/nodes/list.c
@@ -1707,3 +1707,17 @@ list_oid_cmp(const ListCell *p1, const ListCell *p2)
return pg_cmp_u32(v1, v2);
}
+
+#define ST_SORT sort_list_oids
+#define ST_ELEMENT_TYPE ListCell
+#define ST_COMPARE(a, b) list_oid_cmp(a, b)
+#define ST_SCOPE static
+#define ST_DEFINE
+#include <lib/sort_template.h>
+
+/*
+ * Sort list with Oid type optimization.
+ */
+void list_oid_sort(List *data){
+ sort_list_oids(list_head(data), list_length(data));
+}
diff --git a/src/include/nodes/pg_list.h b/src/include/nodes/pg_list.h
index 52df93759f..88aa1ebea9 100644
--- a/src/include/nodes/pg_list.h
+++ b/src/include/nodes/pg_list.h
@@ -679,6 +679,7 @@ extern pg_nodiscard List *list_copy_deep(const List *oldlist);
typedef int (*list_sort_comparator) (const ListCell *a, const ListCell *b);
extern void list_sort(List *list, list_sort_comparator cmp);
+extern void list_oid_sort(List *list);
extern int list_int_cmp(const ListCell *p1, const ListCell *p2);
extern int list_oid_cmp(const ListCell *p1, const ListCell *p2);
--
2.34.1