On Wed, Aug 13, 2014 at 10:27 PM, Benoît Canet <benoit.ca...@irqsave.net> wrote:
> The Wednesday 13 Aug 2014 à 18:08:47 (+0800), Ming Lei wrote :
>> This test runs dummy function with coroutine by using
>> two enter and one yield since which is a common usage.
>>
>> So we can see the cost introduced by corouting for running
>> one function, for example:
>>
>>       Run operation 20000000 iterations 4.841071 s, 4131K operations/s
>>       242ns per coroutine
>>
>> Signed-off-by: Ming Lei <ming....@canonical.com>
>> ---
>>  tests/test-coroutine.c |   30 ++++++++++++++++++++++++++++++
>>  1 file changed, 30 insertions(+)
>>
>> diff --git a/tests/test-coroutine.c b/tests/test-coroutine.c
>> index 6e634f4..e22fae1 100644
>> --- a/tests/test-coroutine.c
>> +++ b/tests/test-coroutine.c
>> @@ -311,6 +311,35 @@ static void perf_baseline(void)
>>          maxcycles, duration);
>>  }
>>
>> +static __attribute__((noinline)) void perf_cost_func(void *opaque)
>> +{
>> +    qemu_coroutine_yield();
>> +}
>> +
>> +static void perf_cost(void)
>> +{
>> +    const unsigned long maxcycles = 40000000;
>> +    unsigned long i = 0;
>> +    double duration;
>> +    unsigned long ops;
>> +    Coroutine *co;
>> +
>> +    g_test_timer_start();
>> +    while (i++ < maxcycles) {
>> +        co = qemu_coroutine_create(perf_cost_func);
>
> I am not sure qemu_coroutine_create is systematically used.
> I rather believe the code try to reuse existing coroutine.

In block layer, it is a common usage, please see bdrv_co_aio_rw_vector(),
and most of times the allocation hits on the pool, as mentioned by
Gabriel Kerneis().  In this test, it should always be from the pool.

Ming


>
>> +        qemu_coroutine_enter(co, &i);
>> +        qemu_coroutine_enter(co, NULL);
>> +    }
>> +    duration = g_test_timer_elapsed();
>> +    ops = (long)(maxcycles / (duration * 1000));
>> +
>> +    g_test_message("Run operation %lu iterations %f s, %luK operations/s, "
>> +                   "%luns per coroutine",
>> +                   maxcycles,
>> +                   duration, ops,
>> +                   (unsigned long)(1000000000 * duration) / maxcycles);
>> +}
>> +
>>  int main(int argc, char **argv)
>>  {
>>      g_test_init(&argc, &argv, NULL);
>> @@ -325,6 +354,7 @@ int main(int argc, char **argv)
>>          g_test_add_func("/perf/nesting", perf_nesting);
>>          g_test_add_func("/perf/yield", perf_yield);
>>          g_test_add_func("/perf/function-call", perf_baseline);
>> +        g_test_add_func("/perf/cost", perf_cost);
>>      }
>>      return g_test_run();
>>  }
>> --
>> 1.7.9.5
>>
>>

Reply via email to