2022-01-04 14:17:44 +00:00
|
|
|
From 0106334335271ad35e1be041492f2e9795a97a60 Mon Sep 17 00:00:00 2001
|
2021-11-09 12:48:31 +00:00
|
|
|
From: Nir Soffer <nsoffer@redhat.com>
|
|
|
|
Date: Fri, 5 Nov 2021 20:36:42 +0200
|
|
|
|
Subject: [PATCH] common/utils/test-vector.c: Add vector benchmarks
|
|
|
|
|
|
|
|
The generic vector reallocs on every append. Add benchmarks to measure
|
|
|
|
the cost with uint32 vector (used for copying extents) and the effect of
|
|
|
|
reserving space upfront.
|
|
|
|
|
|
|
|
The tests show that realloc is pretty efficient, but calling reserve
|
|
|
|
before the appends speeds the appends up significantly.
|
|
|
|
|
|
|
|
NBDKIT_BENCH=1 ./test-vector
|
|
|
|
bench_reserve: 1000000 appends in 0.004503 s
|
|
|
|
bench_append: 1000000 appends in 0.014986 s
|
|
|
|
|
|
|
|
The new benchmarks do not run by default to avoid trouble in CI on
|
|
|
|
overloaded machines or under qemu emulation.
|
|
|
|
|
|
|
|
A new target added to run all benchmaks:
|
|
|
|
|
|
|
|
make bench
|
|
|
|
|
|
|
|
Ported from libnbd:
|
|
|
|
- commit dc9ae0174ab1384081a57a8d54b10f8147ea6430
|
|
|
|
- commit f6c06a3b4d87fe976a96ea04f8da1f22b2531dbd
|
|
|
|
|
|
|
|
(cherry picked from commit a227af7921c9a51c4f1ab699a3b9f06a9a645126)
|
|
|
|
---
|
|
|
|
Makefile.am | 5 +++
|
|
|
|
README | 7 ++++
|
|
|
|
common/utils/Makefile.am | 5 ++-
|
|
|
|
common/utils/bench.h | 72 ++++++++++++++++++++++++++++++++++++++
|
|
|
|
common/utils/test-vector.c | 55 +++++++++++++++++++++++++++--
|
|
|
|
5 files changed, 141 insertions(+), 3 deletions(-)
|
|
|
|
create mode 100644 common/utils/bench.h
|
|
|
|
|
|
|
|
diff --git a/Makefile.am b/Makefile.am
|
|
|
|
index b21d69ed..49f5d91c 100644
|
|
|
|
--- a/Makefile.am
|
|
|
|
+++ b/Makefile.am
|
|
|
|
@@ -102,6 +102,11 @@ check-root:
|
|
|
|
check-vddk:
|
|
|
|
$(MAKE) -C tests check-vddk
|
|
|
|
|
|
|
|
+bench: all
|
|
|
|
+ @for d in common/utils; do \
|
|
|
|
+ $(MAKE) -C $$d bench || exit 1; \
|
|
|
|
+ done
|
|
|
|
+
|
|
|
|
#----------------------------------------------------------------------
|
|
|
|
# Maintainers only!
|
|
|
|
|
|
|
|
diff --git a/README b/README
|
|
|
|
index a04325be..b001620c 100644
|
|
|
|
--- a/README
|
|
|
|
+++ b/README
|
|
|
|
@@ -274,6 +274,13 @@ nbdkit-vddk-plugin against the library like this:
|
|
|
|
|
|
|
|
make check-vddk vddkdir=vmware-vix-disklib-distrib
|
|
|
|
|
|
|
|
+Running the benchmarks
|
|
|
|
+----------------------
|
|
|
|
+
|
|
|
|
+To run benchmarks:
|
|
|
|
+
|
|
|
|
+ make bench
|
|
|
|
+
|
|
|
|
DOWNLOAD TARBALLS
|
|
|
|
=================
|
|
|
|
|
|
|
|
diff --git a/common/utils/Makefile.am b/common/utils/Makefile.am
|
2021-12-19 10:49:24 +00:00
|
|
|
index c33811fc..b2f08cb4 100644
|
2021-11-09 12:48:31 +00:00
|
|
|
--- a/common/utils/Makefile.am
|
|
|
|
+++ b/common/utils/Makefile.am
|
2021-12-19 10:49:24 +00:00
|
|
|
@@ -101,6 +101,9 @@ test_quotes_SOURCES = test-quotes.c quote.c utils.h
|
2021-11-09 12:48:31 +00:00
|
|
|
test_quotes_CPPFLAGS = -I$(srcdir)
|
|
|
|
test_quotes_CFLAGS = $(WARNINGS_CFLAGS)
|
|
|
|
|
|
|
|
-test_vector_SOURCES = test-vector.c vector.c vector.h
|
|
|
|
+test_vector_SOURCES = test-vector.c vector.c vector.h bench.h
|
|
|
|
test_vector_CPPFLAGS = -I$(srcdir)
|
|
|
|
test_vector_CFLAGS = $(WARNINGS_CFLAGS)
|
|
|
|
+
|
|
|
|
+bench: test-vector
|
|
|
|
+ NBDKIT_BENCH=1 ./test-vector
|
|
|
|
diff --git a/common/utils/bench.h b/common/utils/bench.h
|
|
|
|
new file mode 100644
|
|
|
|
index 00000000..496a3614
|
|
|
|
--- /dev/null
|
|
|
|
+++ b/common/utils/bench.h
|
|
|
|
@@ -0,0 +1,72 @@
|
|
|
|
+/* libnbd
|
|
|
|
+ * Copyright (C) 2021 Red Hat Inc.
|
|
|
|
+ *
|
|
|
|
+ * Redistribution and use in source and binary forms, with or without
|
|
|
|
+ * modification, are permitted provided that the following conditions are
|
|
|
|
+ * met:
|
|
|
|
+ *
|
|
|
|
+ * * Redistributions of source code must retain the above copyright
|
|
|
|
+ * notice, this list of conditions and the following disclaimer.
|
|
|
|
+ *
|
|
|
|
+ * * Redistributions in binary form must reproduce the above copyright
|
|
|
|
+ * notice, this list of conditions and the following disclaimer in the
|
|
|
|
+ * documentation and/or other materials provided with the distribution.
|
|
|
|
+ *
|
|
|
|
+ * * Neither the name of Red Hat nor the names of its contributors may be
|
|
|
|
+ * used to endorse or promote products derived from this software without
|
|
|
|
+ * specific prior written permission.
|
|
|
|
+ *
|
|
|
|
+ * THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND
|
|
|
|
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
|
|
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
|
|
|
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
|
|
|
|
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
|
|
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
|
|
|
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
|
|
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
|
|
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
|
|
|
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
+ * SUCH DAMAGE.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#ifndef LIBNBD_BENCH_H
|
|
|
|
+#define LIBNBD_BENCH_H
|
|
|
|
+
|
|
|
|
+#include <sys/time.h>
|
|
|
|
+
|
|
|
|
+#define MICROSECONDS 1000000
|
|
|
|
+
|
|
|
|
+struct bench {
|
|
|
|
+ struct timeval start, stop;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static inline void
|
|
|
|
+bench_start(struct bench *b)
|
|
|
|
+{
|
|
|
|
+ gettimeofday (&b->start, NULL);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static inline void
|
|
|
|
+bench_stop(struct bench *b)
|
|
|
|
+{
|
|
|
|
+ gettimeofday (&b->stop, NULL);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static inline double
|
|
|
|
+bench_sec(struct bench *b)
|
|
|
|
+{
|
|
|
|
+ struct timeval dt;
|
|
|
|
+
|
|
|
|
+ dt.tv_sec = b->stop.tv_sec - b->start.tv_sec;
|
|
|
|
+ dt.tv_usec = b->stop.tv_usec - b->start.tv_usec;
|
|
|
|
+
|
|
|
|
+ if (dt.tv_usec < 0) {
|
|
|
|
+ dt.tv_sec -= 1;
|
|
|
|
+ dt.tv_usec += MICROSECONDS;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return ((double)dt.tv_sec * MICROSECONDS + dt.tv_usec) / MICROSECONDS;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#endif /* LIBNBD_BENCH_H */
|
|
|
|
diff --git a/common/utils/test-vector.c b/common/utils/test-vector.c
|
|
|
|
index 94b2aeb7..28af59b8 100644
|
|
|
|
--- a/common/utils/test-vector.c
|
|
|
|
+++ b/common/utils/test-vector.c
|
|
|
|
@@ -38,9 +38,13 @@
|
|
|
|
#undef NDEBUG /* Keep test strong even for nbdkit built without assertions */
|
|
|
|
#include <assert.h>
|
|
|
|
|
|
|
|
+#include "bench.h"
|
|
|
|
#include "vector.h"
|
|
|
|
|
|
|
|
+#define APPENDS 1000000
|
|
|
|
+
|
|
|
|
DEFINE_VECTOR_TYPE(int64_vector, int64_t);
|
|
|
|
+DEFINE_VECTOR_TYPE(uint32_vector, uint32_t);
|
|
|
|
DEFINE_VECTOR_TYPE(string_vector, char *);
|
|
|
|
|
|
|
|
static int
|
|
|
|
@@ -113,10 +117,57 @@ test_string_vector (void)
|
|
|
|
free (v.ptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
+static void
|
|
|
|
+bench_reserve (void)
|
|
|
|
+{
|
|
|
|
+ uint32_vector v = empty_vector;
|
|
|
|
+ struct bench b;
|
|
|
|
+
|
|
|
|
+ bench_start(&b);
|
|
|
|
+
|
|
|
|
+ uint32_vector_reserve(&v, APPENDS);
|
|
|
|
+
|
|
|
|
+ for (uint32_t i = 0; i < APPENDS; i++) {
|
|
|
|
+ uint32_vector_append (&v, i);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ bench_stop(&b);
|
|
|
|
+
|
|
|
|
+ assert (v.ptr[APPENDS - 1] == APPENDS - 1);
|
|
|
|
+ free (v.ptr);
|
|
|
|
+
|
|
|
|
+ printf ("bench_reserve: %d appends in %.6f s\n", APPENDS, bench_sec (&b));
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void
|
|
|
|
+bench_append (void)
|
|
|
|
+{
|
|
|
|
+ uint32_vector v = empty_vector;
|
|
|
|
+ struct bench b;
|
|
|
|
+
|
|
|
|
+ bench_start(&b);
|
|
|
|
+
|
|
|
|
+ for (uint32_t i = 0; i < APPENDS; i++) {
|
|
|
|
+ uint32_vector_append (&v, i);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ bench_stop(&b);
|
|
|
|
+
|
|
|
|
+ assert (v.ptr[APPENDS - 1] == APPENDS - 1);
|
|
|
|
+ free (v.ptr);
|
|
|
|
+
|
|
|
|
+ printf ("bench_append: %d appends in %.6f s\n", APPENDS, bench_sec (&b));
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
int
|
|
|
|
main (int argc, char *argv[])
|
|
|
|
{
|
|
|
|
- test_int64_vector ();
|
|
|
|
- test_string_vector ();
|
|
|
|
+ if (getenv("NBDKIT_BENCH")) {
|
|
|
|
+ bench_reserve ();
|
|
|
|
+ bench_append ();
|
|
|
|
+ } else {
|
|
|
|
+ test_int64_vector ();
|
|
|
|
+ test_string_vector ();
|
|
|
|
+ }
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
--
|
|
|
|
2.31.1
|
|
|
|
|