aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel Kerneis <gabriel@kerneis.info>2013-09-17 17:09:39 +0200
committerStefan Hajnoczi <stefanha@redhat.com>2013-09-19 13:21:32 +0200
commit2fcd15eac3223b3907837e8d7f2b3829a16a4c45 (patch)
tree4489ee07925144f6bb41cf4fc616f37da159deea
parent3db1ee7c2af2fbbfe259712e3ce74158bc667ad3 (diff)
coroutine: add qemu_coroutine_yield benchmark
Current coroutine performance benchmarks test only coroutine creation, either directly or in a nested way. This patch adds a benchmark to evaluate the performance of qemu_coroutine_yield. Signed-off-by: Gabriel Kerneis <gabriel@kerneis.info> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
-rw-r--r--tests/test-coroutine.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/tests/test-coroutine.c b/tests/test-coroutine.c
index 39be046ec7..2792191f82 100644
--- a/tests/test-coroutine.c
+++ b/tests/test-coroutine.c
@@ -202,6 +202,38 @@ static void perf_nesting(void)
maxcycles, maxnesting, duration);
}
+/*
+ * Yield benchmark
+ */
+
+static void coroutine_fn yield_loop(void *opaque)
+{
+ unsigned int *counter = opaque;
+
+ while ((*counter) > 0) {
+ (*counter)--;
+ qemu_coroutine_yield();
+ }
+}
+
+static void perf_yield(void)
+{
+ unsigned int i, maxcycles;
+ double duration;
+
+ maxcycles = 100000000;
+ i = maxcycles;
+ Coroutine *coroutine = qemu_coroutine_create(yield_loop);
+
+ g_test_timer_start();
+ while (i > 0) {
+ qemu_coroutine_enter(coroutine, &i);
+ }
+ duration = g_test_timer_elapsed();
+
+ g_test_message("Yield %u iterations: %f s\n",
+ maxcycles, duration);
+}
int main(int argc, char **argv)
{
@@ -214,6 +246,7 @@ int main(int argc, char **argv)
if (g_test_perf()) {
g_test_add_func("/perf/lifecycle", perf_lifecycle);
g_test_add_func("/perf/nesting", perf_nesting);
+ g_test_add_func("/perf/yield", perf_yield);
}
return g_test_run();
}