From b56d7bba605d2bd156f438d6dd2da6818474bde3 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Fri, 14 Mar 2014 18:38:30 +0900 Subject: [PATCH] evas: add benchmark for TGV loader and saver. --- configure.ac | 1 + src/Makefile.am | 3 +- src/benchmarks/evas/.gitignore | 1 + src/benchmarks/evas/Makefile.am | 35 ++++++++++ src/benchmarks/evas/evas_bench.c | 54 +++++++++++++++ src/benchmarks/evas/evas_bench.h | 10 +++ src/benchmarks/evas/evas_bench_loader.c | 92 +++++++++++++++++++++++++ src/benchmarks/evas/evas_bench_saver.c | 74 ++++++++++++++++++++ 8 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 src/benchmarks/evas/.gitignore create mode 100644 src/benchmarks/evas/Makefile.am create mode 100644 src/benchmarks/evas/evas_bench.c create mode 100644 src/benchmarks/evas/evas_bench.h create mode 100644 src/benchmarks/evas/evas_bench_loader.c create mode 100644 src/benchmarks/evas/evas_bench_saver.c diff --git a/configure.ac b/configure.ac index a848345bda..82418f32aa 100644 --- a/configure.ac +++ b/configure.ac @@ -4080,6 +4080,7 @@ doc/previews/Makefile src/Makefile src/benchmarks/eina/Makefile src/benchmarks/eo/Makefile +src/benchmarks/evas/Makefile src/examples/eina/Makefile src/examples/eina_cxx/Makefile src/examples/eet/Makefile diff --git a/src/Makefile.am b/src/Makefile.am index f9c2497f4a..58270c792e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -73,7 +73,8 @@ include Makefile_Eina_Cxx.am BENCHMARK_SUBDIRS = \ benchmarks/eina \ -benchmarks/eo +benchmarks/eo \ +benchmarks/evas DIST_SUBDIRS += $(BENCHMARK_SUBDIRS) benchmark: all-am diff --git a/src/benchmarks/evas/.gitignore b/src/benchmarks/evas/.gitignore new file mode 100644 index 0000000000..aee0b35dc7 --- /dev/null +++ b/src/benchmarks/evas/.gitignore @@ -0,0 +1 @@ +/evas_bench diff --git a/src/benchmarks/evas/Makefile.am b/src/benchmarks/evas/Makefile.am new file mode 100644 index 0000000000..31c9d72321 --- /dev/null +++ b/src/benchmarks/evas/Makefile.am @@ -0,0 +1,35 @@ +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I$(top_builddir)/src/lib/efl \ +-I$(top_srcdir)/src/lib/eina \ +-I$(top_builddir)/src/lib/eina \ +-I$(top_srcdir)/src/modules/evas/engines/buffer \ +-DPACKAGE_BUILD_DIR=\"`pwd`/$(top_builddir)\" \ +-DTESTS_SRC_DIR=\"$(abs_top_srcdir)/src/tests/evas\" \ +@EVAS_CFLAGS@ + +EXTRA_PROGRAMS = evas_bench + +benchmark: evas_bench + +evas_bench_SOURCES = \ +evas_bench.c \ +evas_bench_loader.c \ +evas_bench_saver.c \ +evas_bench.h + +nodist_EXTRA_evas_bench_SOURCES = dummy.cc +evas_bench_LDADD = \ +$(top_builddir)/src/lib/evas/libevas.la \ +$(top_builddir)/src/lib/eina/libeina.la \ +@EVAS_LDFLAGS@ + +EXTRA_DIST = + +clean-local: + rm -rf *.gcno ..\#..\#src\#*.gcov *.gcda + +if ALWAYS_BUILD_EXAMPLES +noinst_PROGRAMS = $(EXTRA_PROGRAMS) +endif diff --git a/src/benchmarks/evas/evas_bench.c b/src/benchmarks/evas/evas_bench.c new file mode 100644 index 0000000000..58b806e0c3 --- /dev/null +++ b/src/benchmarks/evas/evas_bench.c @@ -0,0 +1,54 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include "evas_bench.h" +#include "Eina.h" +#include "Evas.h" + +typedef struct _Evas_Benchmark_Case Evas_Benchmark_Case; +struct _Evas_Benchmark_Case +{ + const char *bench_case; + void (*build)(Eina_Benchmark *bench); + Eina_Bool run_by_default; +}; + +static const Evas_Benchmark_Case etc[] = { + { "Loader", evas_bench_loader, EINA_TRUE }, + { "Saver", evas_bench_saver, EINA_TRUE }, + { NULL, NULL, EINA_FALSE } +}; + +int +main(int argc, char **argv) +{ + Eina_Benchmark *test; + unsigned int i; + + evas_init(); + + for (i = 0; etc[i].bench_case; ++i) + { + if (argc == 2 && strcasecmp(etc[i].bench_case, argv[1])) + continue; + + test = eina_benchmark_new(etc[i].bench_case, "default"); + if (!test) + continue; + + etc[i].build(test); + + eina_benchmark_run(test); + + eina_benchmark_free(test); + } + + evas_shutdown(); + + return 0; +} diff --git a/src/benchmarks/evas/evas_bench.h b/src/benchmarks/evas/evas_bench.h new file mode 100644 index 0000000000..cf57213e90 --- /dev/null +++ b/src/benchmarks/evas/evas_bench.h @@ -0,0 +1,10 @@ +#ifndef EVAS_BENCH_H_ +#define EVAS_BENCH_H_ + +#include "eina_benchmark.h" + +void evas_bench_loader(Eina_Benchmark *bench); +void evas_bench_saver(Eina_Benchmark *bench); + +#endif + diff --git a/src/benchmarks/evas/evas_bench_loader.c b/src/benchmarks/evas/evas_bench_loader.c new file mode 100644 index 0000000000..77c168465f --- /dev/null +++ b/src/benchmarks/evas/evas_bench_loader.c @@ -0,0 +1,92 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "Evas.h" +#include "Evas_Engine_Buffer.h" +#include "evas_bench.h" + +static const char * +_test_image_get(const char *name) +{ + static char filename[PATH_MAX]; + + snprintf(filename, PATH_MAX, TESTS_SRC_DIR"/images/%s", name); + + return filename; +} + +static Evas * +_setup_evas() +{ + Evas *evas; + Evas_Engine_Info_Buffer *einfo; + + evas = evas_new(); + + evas_output_method_set(evas, evas_render_method_lookup("buffer")); + einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(evas); + + einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32; + einfo->info.dest_buffer = malloc(sizeof (char) * 500 * 500 * 4); + einfo->info.dest_buffer_row_bytes = 500 * sizeof (char) * 4; + + evas_engine_info_set(evas, (Evas_Engine_Info *)einfo); + + evas_output_size_set(evas, 500, 500); + evas_output_viewport_set(evas, 0, 0, 500, 500); + + return evas; +} + +static void +evas_bench_loader_tgv(int request) +{ + Evas *e = _setup_evas(); + char *large; + char *small; + char *computer; + Evas_Object *o; + Eina_List *l; + int i; + + large = strdup(_test_image_get("Light-50.tgv")); + small = strdup(_test_image_get("Sunrise-100.tgv")); + computer = strdup(_test_image_get("Pic1-50.tgv")); + + for (i = 0; i < request; i++) + { + o = evas_object_image_add(e); + + evas_object_image_file_set(o, large, NULL); + if (!evas_object_image_data_get(o, 0)) break ; + + evas_object_image_file_set(o, small, NULL); + if (!evas_object_image_data_get(o, 0)) break ; + + evas_object_image_file_set(o, computer, NULL); + if (!evas_object_image_data_get(o, 0)) break ; + + evas_object_del(o); + + l = evas_render_updates(e); + evas_render_updates_free(l); + + evas_render_idle_flush(e); + evas_render_dump(e); + } + + fprintf(stderr, "i: %i (%s, %s, %s)\n", + i, large, small, computer); + + free(large); + free(small); + free(computer); + + evas_free(e); +} + +void evas_bench_loader(Eina_Benchmark *bench) +{ + eina_benchmark_register(bench, "tgv-loader", EINA_BENCHMARK(evas_bench_loader_tgv), 20, 2000, 100); +} diff --git a/src/benchmarks/evas/evas_bench_saver.c b/src/benchmarks/evas/evas_bench_saver.c new file mode 100644 index 0000000000..c278b843e2 --- /dev/null +++ b/src/benchmarks/evas/evas_bench_saver.c @@ -0,0 +1,74 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include "Evas.h" +#include "Evas_Engine_Buffer.h" +#include "evas_bench.h" + +static const char * +_test_image_get(const char *name) +{ + static char filename[PATH_MAX]; + + snprintf(filename, PATH_MAX, TESTS_SRC_DIR"/images/%s", name); + + return filename; +} + +static Evas * +_setup_evas() +{ + Evas *evas; + Evas_Engine_Info_Buffer *einfo; + + evas = evas_new(); + + evas_output_method_set(evas, evas_render_method_lookup("buffer")); + einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(evas); + + einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32; + einfo->info.dest_buffer = malloc(sizeof (char) * 500 * 500 * 4); + einfo->info.dest_buffer_row_bytes = 500 * sizeof (char) * 4; + + evas_engine_info_set(evas, (Evas_Engine_Info *)einfo); + + evas_output_size_set(evas, 500, 500); + evas_output_viewport_set(evas, 0, 0, 500, 500); + + return evas; +} + +static void +evas_bench_saver_tgv(int request) +{ + Evas *e = _setup_evas(); + const char *source; + Eina_Tmpstr *dest; + Evas_Object *o; + int i; + + source = _test_image_get("mars_rover_panorama_half-size.jpg"); + eina_file_mkstemp("evas_saver_benchXXXXXX", &dest); + + o = evas_object_image_add(e); + evas_object_image_file_set(o, source, NULL); + + for (i = 0; i < request; i++) + { + evas_object_image_save(o, dest, NULL, "compress=1 quality=50"); + } + + unlink(dest); + eina_tmpstr_del(dest); + + evas_free(e); +} + +void evas_bench_saver(Eina_Benchmark *bench) +{ + eina_benchmark_register(bench, "tgv-saver", EINA_BENCHMARK(evas_bench_saver_tgv), 20, 2000, 100); +}