public inbox for [email protected]help / color / mirror / Atom feed
[PATCH 1/1] resownerbench 2+ messages / 2 participants [nested] [flat]
* [PATCH 1/1] resownerbench @ 2020-11-11 22:40 Heikki Linnakangas <[email protected]> 0 siblings, 0 replies; 2+ messages in thread From: Heikki Linnakangas @ 2020-11-11 22:40 UTC (permalink / raw) --- contrib/resownerbench/Makefile | 17 ++ contrib/resownerbench/resownerbench--1.0.sql | 14 ++ contrib/resownerbench/resownerbench.c | 154 +++++++++++++++++++ contrib/resownerbench/resownerbench.control | 6 + contrib/resownerbench/snaptest.sql | 37 +++++ 5 files changed, 228 insertions(+) create mode 100644 contrib/resownerbench/Makefile create mode 100644 contrib/resownerbench/resownerbench--1.0.sql create mode 100644 contrib/resownerbench/resownerbench.c create mode 100644 contrib/resownerbench/resownerbench.control create mode 100644 contrib/resownerbench/snaptest.sql diff --git a/contrib/resownerbench/Makefile b/contrib/resownerbench/Makefile new file mode 100644 index 00000000000..9b0e1cfee1a --- /dev/null +++ b/contrib/resownerbench/Makefile @@ -0,0 +1,17 @@ +MODULE_big = resownerbench +OBJS = resownerbench.o + +EXTENSION = resownerbench +DATA = resownerbench--1.0.sql +PGFILEDESC = "resownerbench - benchmark for ResourceOwners" + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = contrib/resownerbench +top_builddir = ../.. +include $(top_builddir)/src/Makefile.global +include $(top_srcdir)/contrib/contrib-global.mk +endif diff --git a/contrib/resownerbench/resownerbench--1.0.sql b/contrib/resownerbench/resownerbench--1.0.sql new file mode 100644 index 00000000000..d29182f5982 --- /dev/null +++ b/contrib/resownerbench/resownerbench--1.0.sql @@ -0,0 +1,14 @@ +/* contrib/resownerbench/resownerbench--1.0.sql */ + +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION resownerbench" to load this file. \quit + +CREATE FUNCTION snapshotbench_lifo(numkeep int, numsnaps int, numiters int) +RETURNS double precision +AS 'MODULE_PATHNAME', 'snapshotbench_lifo' +LANGUAGE C STRICT VOLATILE; + +CREATE FUNCTION snapshotbench_fifo(numkeep int, numsnaps int, numiters int) +RETURNS double precision +AS 'MODULE_PATHNAME', 'snapshotbench_fifo' +LANGUAGE C STRICT VOLATILE; diff --git a/contrib/resownerbench/resownerbench.c b/contrib/resownerbench/resownerbench.c new file mode 100644 index 00000000000..acfb6c39199 --- /dev/null +++ b/contrib/resownerbench/resownerbench.c @@ -0,0 +1,154 @@ +#include "postgres.h" + +#include "catalog/pg_type.h" +#include "catalog/pg_statistic.h" +#include "executor/spi.h" +#include "funcapi.h" +#include "libpq/pqsignal.h" +#include "utils/catcache.h" +#include "utils/syscache.h" +#include "utils/timestamp.h" +#include "utils/snapmgr.h" + +PG_MODULE_MAGIC; + +PG_FUNCTION_INFO_V1(snapshotbench_lifo); +PG_FUNCTION_INFO_V1(snapshotbench_fifo); + +/* + * ResourceOwner Performance test, using RegisterSnapshot(). + * + * This takes three parameters: numkeep, numsnaps, numiters. + * + * First, we register 'numkeep' snapshots. They are kept registed + * until the end of the test. Then, we repeatedly register and + * unregister 'numsnaps - numkeep' additional snapshots, repeating + * 'numiters' times. All the register/unregister calls are made in + * LIFO order. + * + * Returns the time spent, in milliseconds. + * + * The idea is to test the performance of ResourceOwnerRemember() + * and ReourceOwnerForget() operations, under different regimes. + * + * In the old implementation, if 'numsnaps' is small enough, all + * the entries fit in the resource owner's small array (it can + * hold 64 entries). + * + * In the new implementation, the array is much smaller, only 8 + * entries, but it's used together with the hash table so that + * we stay in the "array regime" as long as 'numsnaps - numkeep' + * is smaller than 8 entries. + * + * 'numiters' can be adjusted to adjust the overall runtime to be + * suitable long. + */ +Datum +snapshotbench_lifo(PG_FUNCTION_ARGS) +{ + int numkeep = PG_GETARG_INT32(0); + int numsnaps = PG_GETARG_INT32(1); + int numiters = PG_GETARG_INT32(2); + int i; + instr_time start, + duration; + Snapshot lsnap; + Snapshot *rs; + int numregistered = 0; + + rs = palloc(Max(numsnaps, numkeep) * sizeof(Snapshot)); + + lsnap = GetLatestSnapshot(); + + PG_SETMASK(&BlockSig); + INSTR_TIME_SET_CURRENT(start); + + while (numregistered < numkeep) + { + rs[numregistered] = RegisterSnapshot(lsnap); + numregistered++; + } + + for (i = 0 ; i < numiters; i++) + { + while (numregistered < numsnaps) + { + rs[numregistered] = RegisterSnapshot(lsnap); + numregistered++; + } + + while (numregistered > numkeep) + { + numregistered--; + UnregisterSnapshot(rs[numregistered]); + } + } + + while (numregistered > 0) + { + numregistered--; + UnregisterSnapshot(rs[numregistered]); + } + + INSTR_TIME_SET_CURRENT(duration); + INSTR_TIME_SUBTRACT(duration, start); + PG_SETMASK(&UnBlockSig); + + PG_RETURN_FLOAT8(INSTR_TIME_GET_MILLISEC(duration)); +}; + + +/* + * Same, but do the register/unregister operations in + * FIFO order. + */ +Datum +snapshotbench_fifo(PG_FUNCTION_ARGS) +{ + int numkeep = PG_GETARG_INT32(0); + int numsnaps = PG_GETARG_INT32(1); + int numiters = PG_GETARG_INT32(2); + int i, + j; + instr_time start, + duration; + Snapshot lsnap; + Snapshot *rs; + int numregistered = 0; + + rs = palloc(Max(numsnaps, numkeep) * sizeof(Snapshot)); + + lsnap = GetLatestSnapshot(); + + PG_SETMASK(&BlockSig); + INSTR_TIME_SET_CURRENT(start); + + while (numregistered < numkeep) + { + rs[numregistered] = RegisterSnapshot(lsnap); + numregistered++; + } + + for (i = 0 ; i < numiters; i++) + { + while (numregistered < numsnaps) + { + rs[numregistered] = RegisterSnapshot(lsnap); + numregistered++; + } + + for (j = numkeep; j < numregistered; j++) + UnregisterSnapshot(rs[j]); + numregistered = numkeep; + } + + for (j = 0; j < numregistered; j++) + UnregisterSnapshot(rs[j]); + numregistered = numkeep; + + INSTR_TIME_SET_CURRENT(duration); + INSTR_TIME_SUBTRACT(duration, start); + PG_SETMASK(&UnBlockSig); + + PG_RETURN_FLOAT8(INSTR_TIME_GET_MILLISEC(duration)); +}; diff --git a/contrib/resownerbench/resownerbench.control b/contrib/resownerbench/resownerbench.control new file mode 100644 index 00000000000..ada88b8eed8 --- /dev/null +++ b/contrib/resownerbench/resownerbench.control @@ -0,0 +1,6 @@ +# resownerbench + +comment = 'benchmark for ResourceOwners' +default_version = '1.0' +module_pathname = '$libdir/resownerbench' +relocatable = true diff --git a/contrib/resownerbench/snaptest.sql b/contrib/resownerbench/snaptest.sql new file mode 100644 index 00000000000..18c54e13fc9 --- /dev/null +++ b/contrib/resownerbench/snaptest.sql @@ -0,0 +1,37 @@ +-- +-- Performance test RegisterSnapshot/UnregisterSnapshot. +-- +select numkeep, numsnaps, + -- numiters, + -- round(lifo_time_ms) as lifo_total_time_ms, + -- round(fifo_time_ms) as fifo_total_time_ms, + round((lifo_time_ms::numeric / (numkeep + (numsnaps - numkeep) * numiters)) * 1000000, 1) as lifo_time_ns, + round((fifo_time_ms::numeric / (numkeep + (numsnaps - numkeep) * numiters)) * 1000000, 1) as fifo_time_ns +from +(values (0, 1, 10000000), + (0, 5, 2000000), + (0, 10, 1000000), + (0, 60, 100000), + (0, 70, 100000), + (0, 100, 100000), + (0, 1000, 10000), + (0, 10000, 1000), + +-- These tests keep 9 snapshots registered across the iterations. That +-- exceeds the size of the little array in the patch, so this exercises +-- the hash lookups. Without the patch, these still fit in the array +-- (it's 64 entries without the patch) + (9, 10, 10000000), + (9, 100, 100000), + (9, 1000, 10000), + (9, 10000, 1000), + +-- These exceed the 64 entry array even without the patch, so these fall +-- in the hash table regime with and without the patch. + (65, 70, 1000000), + (65, 100, 100000), + (65, 1000, 10000), + (65, 10000, 1000) +) AS params (numkeep, numsnaps, numiters), +lateral snapshotbench_lifo(numkeep, numsnaps, numiters) as lifo_time_ms, +lateral snapshotbench_fifo(numkeep, numsnaps, numiters) as fifo_time_ms; -- 2.29.2 --------------1104342304EC6341F5D7C60C-- ^ permalink raw reply [nested|flat] 2+ messages in thread
* collation settings table in v16 docs @ 2023-06-05 02:31 Jeremy Schneider <[email protected]> 0 siblings, 0 replies; 2+ messages in thread From: Jeremy Schneider @ 2023-06-05 02:31 UTC (permalink / raw) To: Davis, Jeff <[email protected]>; Peter Eisentraut <[email protected]>; Jonathan S. Katz <[email protected]>; Robert Haas <[email protected]>; +Cc: pgsql-hackers Looking at the "collation settings" table in the v16 docs, I think some readers may have a little difficulty understanding what each row means. https://www.postgresql.org/docs/devel/collation.html#ICU-COLLATION-SETTINGS The "Key" column isn't meaningful and it's a bit arduous to read the whole description column for every row in the table, just to understand which keys I might be interested in. I like how Peter's recent blog used the alias to organize the keys. http://peter.eisentraut.org/blog/2023/05/16/overview-of-icu-collation-settings I'd suggest that we add a column to this table with the alias, and also have a consistent first sentence of each description, generally aligned with the description from the upstream XML that Peter also referenced in his blog. I have an example below (and patch attached); I think this would make the table a bit more understandable. -Jeremy === Key: ka Alias: colAlternate **<-added** Values: noignore, shifted Default: noignore Description: **Collation parameter key for alternate handling.** If set to shifted, causes some characters (e.g. punctuation or space) to be ignored in comparison. Key ks must be set to level3 or lower to take effect. Set key kv to control which character classes are ignored. === Key: kb Alias: colBackwards **<-added** Values: true, false Default: false Description: **Collation parameter key for backwards comparison of** the level 2 differences. For example, locale und-u-kb sorts 'àe' before 'aé'. -- http://about.me/jeremy_schneider diff --git a/doc/src/sgml/charset.sgml b/doc/src/sgml/charset.sgml index ed84465996..5f81afdb85 100644 --- a/doc/src/sgml/charset.sgml +++ b/doc/src/sgml/charset.sgml @@ -1269,10 +1269,12 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false <colspec colname="col1" colwidth="1*"/> <colspec colname="col2" colwidth="2*"/> <colspec colname="col3" colwidth="2*"/> - <colspec colname="col4" colwidth="5*"/> + <colspec colname="col4" colwidth="2*"/> + <colspec colname="col5" colwidth="5*"/> <thead> <row> <entry>Key</entry> + <entry>Alias</entry> <entry>Values</entry> <entry>Default</entry> <entry>Description</entry> @@ -1281,6 +1283,7 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false <tbody> <row> <entry><literal>co</literal></entry> + <entry></entry> <entry><literal>emoji</literal>, <literal>phonebk</literal>, <literal>standard</literal>, <replaceable>...</replaceable></entry> <entry><literal>standard</literal></entry> <entry> @@ -1289,9 +1292,11 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false </row> <row> <entry><literal>ka</literal></entry> + <entry><literal>colAlternate</literal></entry> <entry><literal>noignore</literal>, <literal>shifted</literal></entry> <entry><literal>noignore</literal></entry> <entry> + Collation parameter key for alternate handling. If set to <literal>shifted</literal>, causes some characters (e.g. punctuation or space) to be ignored in comparison. Key <literal>ks</literal> must be set to <literal>level3</literal> or @@ -1301,20 +1306,24 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false </row> <row> <entry><literal>kb</literal></entry> + <entry><literal>colBackwards</literal></entry> <entry><literal>true</literal>, <literal>false</literal></entry> <entry><literal>false</literal></entry> <entry> - Backwards comparison for the level 2 differences. For example, + Collation parameter key for + backwards comparison of the level 2 differences. For example, locale <literal>und-u-kb</literal> sorts <literal>'àe'</literal> before <literal>'aé'</literal>. </entry> </row> <row> <entry><literal>kc</literal></entry> + <entry><literal>colCaseLevel</literal></entry> <entry><literal>true</literal>, <literal>false</literal></entry> <entry><literal>false</literal></entry> <entry> <para> + Collation parameter key for case level. Separates case into a "level 2.5" that falls between accents and other level 3 features. </para> @@ -1327,12 +1336,14 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false </row> <row> <entry><literal>kf</literal></entry> + <entry><literal>colCaseFirst</literal></entry> <entry> <literal>upper</literal>, <literal>lower</literal>, <literal>false</literal> </entry> <entry><literal>false</literal></entry> <entry> + Collation parameter key for ordering by case. If set to <literal>upper</literal>, upper case sorts before lower case. If set to <literal>lower</literal>, lower case sorts before upper case. If set to <literal>false</literal>, the sort depends on @@ -1341,9 +1352,11 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false </row> <row> <entry><literal>kn</literal></entry> + <entry><literal>colNumeric</literal></entry> <entry><literal>true</literal>, <literal>false</literal></entry> <entry><literal>false</literal></entry> <entry> + Collation parameter key for numeric handling. If set to <literal>true</literal>, numbers within a string are treated as a single numeric value rather than a sequence of digits. For example, <literal>'id-45'</literal> sorts before @@ -1352,11 +1365,13 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false </row> <row> <entry><literal>kk</literal></entry> + <entry><literal>colNormalization</literal></entry> <entry><literal>true</literal>, <literal>false</literal></entry> <entry><literal>false</literal></entry> <entry> <para> - Enable full normalization; may affect performance. Basic + Collation parameter key for + full normalization; may affect performance. Basic normalization is performed even when set to <literal>false</literal>. Locales for languages that require full normalization typically enable it by default. @@ -1375,6 +1390,7 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false </row> <row> <entry><literal>kr</literal></entry> + <entry><literal>colReorder</literal></entry> <entry> <literal>space</literal>, <literal>punct</literal>, <literal>symbol</literal>, <literal>currency</literal>, @@ -1383,6 +1399,7 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false <entry></entry> <entry> <para> + Collation reorder codes. Set to one or more of the valid values, or any BCP 47 <replaceable>script-id</replaceable>, e.g. <literal>latn</literal> ("Latin") or <literal>grek</literal> ("Greek"). Multiple values are @@ -1400,9 +1417,11 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false </row> <row> <entry><literal>ks</literal></entry> + <entry><literal>colStrength</literal></entry> <entry><literal>level1</literal>, <literal>level2</literal>, <literal>level3</literal>, <literal>level4</literal>, <literal>identic</literal></entry> <entry><literal>level3</literal></entry> <entry> + Collation parameter key for collation strength. Sensitivity (or "strength") when determining equality, with <literal>level1</literal> the least sensitive to differences and <literal>identic</literal> the most sensitive to differences. See @@ -1411,13 +1430,16 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false </row> <row> <entry><literal>kv</literal></entry> + <entry><literal>maxVariable</literal></entry> <entry> <literal>space</literal>, <literal>punct</literal>, <literal>symbol</literal>, <literal>currency</literal> </entry> <entry><literal>punct</literal></entry> <entry> - Classes of characters ignored during comparison at level 3. Setting + Collation parameter key for maxVariable, the last reordering group + to be affected by ka-shifted. This determines + classes of characters ignored during comparison at level 3. Setting to a later value includes earlier values; e.g. <literal>symbol</literal> also includes <literal>punct</literal> and <literal>space</literal> in the Attachments: [text/plain] 01-doc-update-proposal.patch (7.1K, ../../[email protected]/2-01-doc-update-proposal.patch) download | inline diff: diff --git a/doc/src/sgml/charset.sgml b/doc/src/sgml/charset.sgml index ed84465996..5f81afdb85 100644 --- a/doc/src/sgml/charset.sgml +++ b/doc/src/sgml/charset.sgml @@ -1269,10 +1269,12 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false <colspec colname="col1" colwidth="1*"/> <colspec colname="col2" colwidth="2*"/> <colspec colname="col3" colwidth="2*"/> - <colspec colname="col4" colwidth="5*"/> + <colspec colname="col4" colwidth="2*"/> + <colspec colname="col5" colwidth="5*"/> <thead> <row> <entry>Key</entry> + <entry>Alias</entry> <entry>Values</entry> <entry>Default</entry> <entry>Description</entry> @@ -1281,6 +1283,7 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false <tbody> <row> <entry><literal>co</literal></entry> + <entry></entry> <entry><literal>emoji</literal>, <literal>phonebk</literal>, <literal>standard</literal>, <replaceable>...</replaceable></entry> <entry><literal>standard</literal></entry> <entry> @@ -1289,9 +1292,11 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false </row> <row> <entry><literal>ka</literal></entry> + <entry><literal>colAlternate</literal></entry> <entry><literal>noignore</literal>, <literal>shifted</literal></entry> <entry><literal>noignore</literal></entry> <entry> + Collation parameter key for alternate handling. If set to <literal>shifted</literal>, causes some characters (e.g. punctuation or space) to be ignored in comparison. Key <literal>ks</literal> must be set to <literal>level3</literal> or @@ -1301,20 +1306,24 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false </row> <row> <entry><literal>kb</literal></entry> + <entry><literal>colBackwards</literal></entry> <entry><literal>true</literal>, <literal>false</literal></entry> <entry><literal>false</literal></entry> <entry> - Backwards comparison for the level 2 differences. For example, + Collation parameter key for + backwards comparison of the level 2 differences. For example, locale <literal>und-u-kb</literal> sorts <literal>'àe'</literal> before <literal>'aé'</literal>. </entry> </row> <row> <entry><literal>kc</literal></entry> + <entry><literal>colCaseLevel</literal></entry> <entry><literal>true</literal>, <literal>false</literal></entry> <entry><literal>false</literal></entry> <entry> <para> + Collation parameter key for case level. Separates case into a "level 2.5" that falls between accents and other level 3 features. </para> @@ -1327,12 +1336,14 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false </row> <row> <entry><literal>kf</literal></entry> + <entry><literal>colCaseFirst</literal></entry> <entry> <literal>upper</literal>, <literal>lower</literal>, <literal>false</literal> </entry> <entry><literal>false</literal></entry> <entry> + Collation parameter key for ordering by case. If set to <literal>upper</literal>, upper case sorts before lower case. If set to <literal>lower</literal>, lower case sorts before upper case. If set to <literal>false</literal>, the sort depends on @@ -1341,9 +1352,11 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false </row> <row> <entry><literal>kn</literal></entry> + <entry><literal>colNumeric</literal></entry> <entry><literal>true</literal>, <literal>false</literal></entry> <entry><literal>false</literal></entry> <entry> + Collation parameter key for numeric handling. If set to <literal>true</literal>, numbers within a string are treated as a single numeric value rather than a sequence of digits. For example, <literal>'id-45'</literal> sorts before @@ -1352,11 +1365,13 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false </row> <row> <entry><literal>kk</literal></entry> + <entry><literal>colNormalization</literal></entry> <entry><literal>true</literal>, <literal>false</literal></entry> <entry><literal>false</literal></entry> <entry> <para> - Enable full normalization; may affect performance. Basic + Collation parameter key for + full normalization; may affect performance. Basic normalization is performed even when set to <literal>false</literal>. Locales for languages that require full normalization typically enable it by default. @@ -1375,6 +1390,7 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false </row> <row> <entry><literal>kr</literal></entry> + <entry><literal>colReorder</literal></entry> <entry> <literal>space</literal>, <literal>punct</literal>, <literal>symbol</literal>, <literal>currency</literal>, @@ -1383,6 +1399,7 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false <entry></entry> <entry> <para> + Collation reorder codes. Set to one or more of the valid values, or any BCP 47 <replaceable>script-id</replaceable>, e.g. <literal>latn</literal> ("Latin") or <literal>grek</literal> ("Greek"). Multiple values are @@ -1400,9 +1417,11 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false </row> <row> <entry><literal>ks</literal></entry> + <entry><literal>colStrength</literal></entry> <entry><literal>level1</literal>, <literal>level2</literal>, <literal>level3</literal>, <literal>level4</literal>, <literal>identic</literal></entry> <entry><literal>level3</literal></entry> <entry> + Collation parameter key for collation strength. Sensitivity (or "strength") when determining equality, with <literal>level1</literal> the least sensitive to differences and <literal>identic</literal> the most sensitive to differences. See @@ -1411,13 +1430,16 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false </row> <row> <entry><literal>kv</literal></entry> + <entry><literal>maxVariable</literal></entry> <entry> <literal>space</literal>, <literal>punct</literal>, <literal>symbol</literal>, <literal>currency</literal> </entry> <entry><literal>punct</literal></entry> <entry> - Classes of characters ignored during comparison at level 3. Setting + Collation parameter key for maxVariable, the last reordering group + to be affected by ka-shifted. This determines + classes of characters ignored during comparison at level 3. Setting to a later value includes earlier values; e.g. <literal>symbol</literal> also includes <literal>punct</literal> and <literal>space</literal> in the ^ permalink raw reply [nested|flat] 2+ messages in thread
end of thread, other threads:[~2023-06-05 02:31 UTC | newest] Thread overview: 2+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2020-11-11 22:40 [PATCH 1/1] resownerbench Heikki Linnakangas <[email protected]> 2023-06-05 02:31 collation settings table in v16 docs Jeremy Schneider <[email protected]>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox