mirror of
https://git.proxmox.com/git/qemu
synced 2025-08-14 12:07:25 +00:00
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:
parent
3db1ee7c2a
commit
2fcd15eac3
@ -202,6 +202,38 @@ static void perf_nesting(void)
|
|||||||
maxcycles, maxnesting, duration);
|
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)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -214,6 +246,7 @@ int main(int argc, char **argv)
|
|||||||
if (g_test_perf()) {
|
if (g_test_perf()) {
|
||||||
g_test_add_func("/perf/lifecycle", perf_lifecycle);
|
g_test_add_func("/perf/lifecycle", perf_lifecycle);
|
||||||
g_test_add_func("/perf/nesting", perf_nesting);
|
g_test_add_func("/perf/nesting", perf_nesting);
|
||||||
|
g_test_add_func("/perf/yield", perf_yield);
|
||||||
}
|
}
|
||||||
return g_test_run();
|
return g_test_run();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user