diff options
author | Gabriel Kerneis <gabriel@kerneis.info> | 2013-09-17 17:09:39 +0200 |
---|---|---|
committer | Stefan Hajnoczi <stefanha@redhat.com> | 2013-09-19 13:21:32 +0200 |
commit | 2fcd15eac3223b3907837e8d7f2b3829a16a4c45 (patch) | |
tree | 4489ee07925144f6bb41cf4fc616f37da159deea | |
parent | 3db1ee7c2af2fbbfe259712e3ce74158bc667ad3 (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.c | 33 |
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(); } |