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>
This commit is contained in:
Gabriel Kerneis 2013-09-17 17:09:39 +02:00 committed by Stefan Hajnoczi
parent 3db1ee7c2a
commit 2fcd15eac3
1 changed files with 33 additions and 0 deletions

View File

@ -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();
}