From 72bb462b1dab005cbc2aff265baedbaaee62cb2b Mon Sep 17 00:00:00 2001 From: John Naylor Date: Tue, 14 Feb 2023 17:02:53 +0700 Subject: [PATCH v27 8/9] Measure iteration of tidstore --- .../bench_radix_tree--1.0.sql | 3 +- contrib/bench_radix_tree/bench_radix_tree.c | 40 ++++++++++++++++--- contrib/meson.build | 2 +- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/contrib/bench_radix_tree/bench_radix_tree--1.0.sql b/contrib/bench_radix_tree/bench_radix_tree--1.0.sql index fbf51c1086..ad66265e23 100644 --- a/contrib/bench_radix_tree/bench_radix_tree--1.0.sql +++ b/contrib/bench_radix_tree/bench_radix_tree--1.0.sql @@ -80,7 +80,8 @@ create function bench_tidstore_load( minblk int4, maxblk int4, OUT mem_allocated int8, -OUT load_ms int8 +OUT load_ms int8, +OUT iter_ms int8 ) returns record as 'MODULE_PATHNAME' diff --git a/contrib/bench_radix_tree/bench_radix_tree.c b/contrib/bench_radix_tree/bench_radix_tree.c index b5ad75364c..6e5149e2c4 100644 --- a/contrib/bench_radix_tree/bench_radix_tree.c +++ b/contrib/bench_radix_tree/bench_radix_tree.c @@ -176,15 +176,18 @@ bench_tidstore_load(PG_FUNCTION_ARGS) BlockNumber minblk = PG_GETARG_INT32(0); BlockNumber maxblk = PG_GETARG_INT32(1); TidStore *ts; + TidStoreIter *iter; + TidStoreIterResult *result; OffsetNumber *offs; TimestampTz start_time, end_time; long secs; int usecs; int64 load_ms; + int64 iter_ms; TupleDesc tupdesc; - Datum values[2]; - bool nulls[2] = {false}; + Datum values[3]; + bool nulls[3] = {false}; /* Build a tuple descriptor for our result type */ if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) @@ -196,9 +199,6 @@ bench_tidstore_load(PG_FUNCTION_ARGS) ts = tidstore_create(1 * 1024L * 1024L * 1024L, MaxHeapTuplesPerPage, NULL); - elog(NOTICE, "sleeping for 2 seconds..."); - pg_usleep(2 * 1000000L); - /* load tids */ start_time = GetCurrentTimestamp(); for (BlockNumber blkno = minblk; blkno < maxblk; blkno++) @@ -207,8 +207,22 @@ bench_tidstore_load(PG_FUNCTION_ARGS) TimestampDifference(start_time, end_time, &secs, &usecs); load_ms = secs * 1000 + usecs / 1000; + elog(NOTICE, "sleeping for 2 seconds..."); + pg_usleep(2 * 1000000L); + + /* iterate through tids */ + iter = tidstore_begin_iterate(ts); + start_time = GetCurrentTimestamp(); + while ((result = tidstore_iterate_next(iter)) != NULL) + ; + tidstore_end_iterate(iter); + end_time = GetCurrentTimestamp(); + TimestampDifference(start_time, end_time, &secs, &usecs); + iter_ms = secs * 1000 + usecs / 1000; + values[0] = Int64GetDatum(tidstore_memory_usage(ts)); values[1] = Int64GetDatum(load_ms); + values[2] = Int64GetDatum(iter_ms); tidstore_destroy(ts); PG_RETURN_DATUM(HeapTupleGetDatum(heap_form_tuple(tupdesc, values, nulls))); @@ -715,3 +729,19 @@ bench_node128_load(PG_FUNCTION_ARGS) rt_free(rt); PG_RETURN_DATUM(HeapTupleGetDatum(heap_form_tuple(tupdesc, values, nulls))); } + +/* to silence warnings about unused iter functions */ +static void pg_attribute_unused() +stub_iter() +{ + rt_radix_tree *rt; + rt_iter *iter; + uint64 key = 1; + uint64 value = 1; + + rt = rt_create(CurrentMemoryContext); + + iter = rt_begin_iterate(rt); + rt_iterate_next(iter, &key, &value); + rt_end_iterate(iter); +} \ No newline at end of file diff --git a/contrib/meson.build b/contrib/meson.build index 52253de793..421d469f8c 100644 --- a/contrib/meson.build +++ b/contrib/meson.build @@ -12,7 +12,7 @@ subdir('amcheck') subdir('auth_delay') subdir('auto_explain') subdir('basic_archive') -#subdir('bench_radix_tree') +subdir('bench_radix_tree') subdir('bloom') subdir('basebackup_to_shell') subdir('bool_plperl') -- 2.39.1