From 4bf0f6455d3b7df37c922fb011a0fa9c6cc12fe2 Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Wed, 14 Oct 2015 15:03:33 +0100 Subject: [PATCH] Eo benchmarks: Add basic callbacks benchmarks. --- src/benchmarks/eo/Makefile.am | 1 + src/benchmarks/eo/class_simple.c | 3 ++ src/benchmarks/eo/class_simple.h | 6 +++ src/benchmarks/eo/eo_bench.c | 1 + src/benchmarks/eo/eo_bench.h | 1 + src/benchmarks/eo/eo_bench_callbacks.c | 85 ++++++++++++++++++++++++++++++++++ 6 files changed, 97 insertions(+) create mode 100644 src/benchmarks/eo/eo_bench_callbacks.c diff --git a/src/benchmarks/eo/Makefile.am b/src/benchmarks/eo/Makefile.am index 84d55b0..9fa4c1e 100644 --- a/src/benchmarks/eo/Makefile.am +++ b/src/benchmarks/eo/Makefile.am @@ -18,6 +18,7 @@ class_simple.c \ class_simple.h \ eo_bench.c \ eo_bench.h \ +eo_bench_callbacks.c \ eo_bench_eo_do.c \ eo_bench_eo_add.c diff --git a/src/benchmarks/eo/class_simple.c b/src/benchmarks/eo/class_simple.c index 7ff15db..0a57e28 100644 --- a/src/benchmarks/eo/class_simple.c +++ b/src/benchmarks/eo/class_simple.c @@ -7,6 +7,9 @@ #define MY_CLASS SIMPLE_CLASS +EOAPI const Eo_Event_Description _SIMPLE_FOO = EO_EVENT_DESCRIPTION("foo"); +EOAPI const Eo_Event_Description _SIMPLE_BAR = EO_EVENT_DESCRIPTION("bar"); + static void _other_call(Eo *obj EINA_UNUSED, void *class_data EINA_UNUSED, Eo *other, int times) { diff --git a/src/benchmarks/eo/class_simple.h b/src/benchmarks/eo/class_simple.h index 1d78188..6460b0a 100644 --- a/src/benchmarks/eo/class_simple.h +++ b/src/benchmarks/eo/class_simple.h @@ -14,4 +14,10 @@ EAPI void simple_other_call(Eo *other, int times); #define SIMPLE_CLASS simple_class_get() const Eo_Class *simple_class_get(void); +EOAPI extern const Eo_Event_Description _SIMPLE_FOO; +EOAPI extern const Eo_Event_Description _SIMPLE_BAR; + +#define SIMPLE_FOO (&(_SIMPLE_FOO)) +#define SIMPLE_BAR (&(_SIMPLE_BAR)) + #endif diff --git a/src/benchmarks/eo/eo_bench.c b/src/benchmarks/eo/eo_bench.c index 9266e6e..3b6584e 100644 --- a/src/benchmarks/eo/eo_bench.c +++ b/src/benchmarks/eo/eo_bench.c @@ -21,6 +21,7 @@ struct _Eina_Benchmark_Case static const Eina_Benchmark_Case etc[] = { { "eo_do", eo_bench_eo_do }, { "eo_add", eo_bench_eo_add }, + { "eo_callbacks", eo_bench_callbacks }, { NULL, NULL } }; diff --git a/src/benchmarks/eo/eo_bench.h b/src/benchmarks/eo/eo_bench.h index 9e3e80d..88ee999 100644 --- a/src/benchmarks/eo/eo_bench.h +++ b/src/benchmarks/eo/eo_bench.h @@ -3,6 +3,7 @@ void eo_bench_eo_do(Eina_Benchmark *bench); void eo_bench_eo_add(Eina_Benchmark *bench); +void eo_bench_callbacks(Eina_Benchmark *bench); #define _EO_BENCH_TIMES(Start, Repeat, Jump) (Start), ((Start) + ((Jump) * (Repeat))), (Jump) diff --git a/src/benchmarks/eo/eo_bench_callbacks.c b/src/benchmarks/eo/eo_bench_callbacks.c new file mode 100644 index 0000000..fde611e --- /dev/null +++ b/src/benchmarks/eo/eo_bench_callbacks.c @@ -0,0 +1,85 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "Eo.h" +#include "eo_bench.h" +#include "class_simple.h" + +static Eina_Bool +_cb(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED) +{ + return EO_CALLBACK_CONTINUE; +} + + +static void +bench_eo_callbacks_add(int request) +{ + int i; + Eo *obj = eo_add(SIMPLE_CLASS, NULL); + + for (i = 0 ; i < request ; i++) + { + eo_do(obj, eo_event_callback_priority_add(SIMPLE_FOO, (short) i, _cb, NULL)); + } + + eo_unref(obj); +} + +static void +bench_eo_callbacks_call(int request) +{ + /* Distribution of calls per amount of callbacks in an object as recorded by + running the genlist elementary_test test. */ + const double distribution[] = { + 0.2920468197, + 0.2073086496, + 0.217699456, + 0.0207158285, + 0.019707134, + 0.0359433565, + 0.0324896742, + 0.0104299639, + 0.028989003, + 0.0082496801, + 0.123214227, + 0.0001331351, + 0.0030730724 + }; + + const int len = EINA_C_ARRAY_LENGTH(distribution); + int i, j; + Eo *obj[len] = { 0 }; + for (i = 0 ; i < len ; i++) + { + obj[i] = eo_add(SIMPLE_CLASS, NULL); + + for (j = 0 ; j < i ; j++) + { + eo_do(obj[i], eo_event_callback_priority_add(SIMPLE_FOO, (short) j, _cb, NULL)); + } + } + + for (i = 0 ; i < len ; i++) + { + for (j = 0 ; j < (int) (distribution[i] * request) ; j++) + { + /* Miss finding the callbacks on purpose, so we measure worst case scenario. */ + eo_do(obj[i], eo_event_callback_call(SIMPLE_BAR, NULL)); + } + } + + for (i = 0 ; i < len ; i++) + { + eo_unref(obj[i]); + } +} + +void eo_bench_callbacks(Eina_Benchmark *bench) +{ + eina_benchmark_register(bench, "add", + EINA_BENCHMARK(bench_eo_callbacks_add), _EO_BENCH_TIMES(1000, 10, 2000)); + eina_benchmark_register(bench, "call", + EINA_BENCHMARK(bench_eo_callbacks_call), _EO_BENCH_TIMES(100000, 10, 500000)); +} -- 2.7.4