From 3a3890ed9389c83a0fcf7e061b23ae947da9d4a2 Mon Sep 17 00:00:00 2001
From: Ilya Verbin <iverbin@tarantool.org>
Date: Tue, 3 Oct 2023 15:42:21 +0300
Subject: [PATCH] perf: add TreeReplaceRandomExistingKeys to memtx benchmark

It is similar to TreeGetRandomExistingKeys, but performs box_replace()
instead of box_index_get().

Needed for #6762

NO_DOC=benchmark
NO_TEST=benchmark
NO_CHANGELOG=benchmark
---
 perf/memtx.cc | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/perf/memtx.cc b/perf/memtx.cc
index a346514dee..afa7346b45 100644
--- a/perf/memtx.cc
+++ b/perf/memtx.cc
@@ -359,6 +359,32 @@ BENCHMARK_F(MemtxFixture, TreeSelectAll)
 	state.SetItemsProcessed(counter);
 }
 
+/**
+ * Benchmark random `replace`s of existing keys in the tree index.
+ * The key subset is regenerated through every iteration.
+ */
+BENCHMARK_F(MemtxFixture, TreeReplaceRandomExistingKeys)
+(benchmark::State & state)
+{
+	auto itr = key_subset.begin();
+	int64_t counter = 0;
+	for (MAYBE_UNUSED auto _ : state) {
+		if (itr == key_subset.end()) {
+			state.PauseTiming();
+			generate_key_subset();
+			state.ResumeTiming();
+			itr = key_subset.begin();
+		}
+		struct tuple *result;
+		if (::box_replace(sid, itr->first, itr->second, &result) != 0)
+			panic("failed to replace the tuple");
+		benchmark::DoNotOptimize(result);
+		++counter;
+		++itr;
+	}
+	state.SetItemsProcessed(counter);
+}
+
 BENCHMARK_MAIN();
 
 #include "debug_warning.h"
-- 
GitLab