Skip to content

Commit

Permalink
coroutine: add qemu_coroutine_yield benchmark
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
kerneis authored and stefanhaRH committed Sep 19, 2013
1 parent 3db1ee7 commit 2fcd15e
Showing 1 changed file with 33 additions and 0 deletions.
33 changes: 33 additions & 0 deletions tests/test-coroutine.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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();
}

0 comments on commit 2fcd15e

Please sign in to comment.