1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
#include "memory.h"
#include "fiber.h"
enum {
ITERATIONS = 50000,
FIBERS = 100
};
static int
yield_f(va_list ap)
{
for (int i = 0; i < ITERATIONS; i++) {
fiber_wakeup(fiber());
fiber_yield();
}
return 0;
}
static int
benchmark_f(va_list ap)
{
struct fiber *fibers[FIBERS];
for (int i = 0; i < FIBERS; i++) {
fibers[i] = fiber_new_xc("yield-wielder", yield_f);
fiber_wakeup(fibers[i]);
}
/** Wait for fibers to die. */
for (int i = 0; i < FIBERS; i++) {
while (fibers[i]->fid > 0)
fiber_sleep(0.001);
}
ev_break(loop(), EVBREAK_ALL);
return 0;
}
int main()
{
memory_init();
fiber_init(fiber_cxx_invoke);
struct fiber *benchmark = fiber_new_xc("benchmark", benchmark_f);
fiber_wakeup(benchmark);
ev_run(loop(), 0);
fiber_free();
memory_free();
return 0;
}
|