diff options
author | Jukka Jylänki <jujjyl@gmail.com> | 2013-04-11 14:31:36 +0300 |
---|---|---|
committer | Jukka Jylänki <jujjyl@gmail.com> | 2013-04-18 20:08:21 +0300 |
commit | d9886ee985f8c2f5fd3f3ac8d88867d3895e3366 (patch) | |
tree | d52b1d9aa7e4ea8c453d806ced34ed76d4b27e91 | |
parent | 9a310fb5b6043e93bc37ebb894b8487fc9fd7ef6 (diff) |
Added synthetic benchmark for comparing class member function call in C++ and embind.
-rw-r--r-- | tests/embind/embind.benchmark.js | 20 | ||||
-rw-r--r-- | tests/embind/embind_benchmark.cpp | 61 |
2 files changed, 81 insertions, 0 deletions
diff --git a/tests/embind/embind.benchmark.js b/tests/embind/embind.benchmark.js index 7b08be5d..035f91ff 100644 --- a/tests/embind/embind.benchmark.js +++ b/tests/embind/embind.benchmark.js @@ -18,6 +18,26 @@ function _increment_counter_benchmark_js(N) { Module.print("JS increment_counter " + N + " iters: " + (b-a)*1000 + " msecs. result: " + (ctr2-ctr)); } +function _increment_class_counter_benchmark_embind_js(N) { + var foo = new Module.Foo(); + var a = _emscripten_get_now(); + for(i = 0; i < N; ++i) { + foo.incr_class_counter(); + foo.incr_class_counter(); + foo.incr_class_counter(); + foo.incr_class_counter(); + foo.incr_class_counter(); + foo.incr_class_counter(); + foo.incr_class_counter(); + foo.incr_class_counter(); + foo.incr_class_counter(); + foo.incr_class_counter(); + } + var b = _emscripten_get_now(); + Module.print("JS increment_class_counter_embind " + N + " iters: " + (b-a)*1000 + " msecs. result: " + foo.class_counter_val()); + foo.delete(); +} + function _returns_input_benchmark_js() { var a = _emscripten_get_now(); var t = 0; diff --git a/tests/embind/embind_benchmark.cpp b/tests/embind/embind_benchmark.cpp index c9391a29..6bf71d56 100644 --- a/tests/embind/embind_benchmark.cpp +++ b/tests/embind/embind_benchmark.cpp @@ -42,8 +42,35 @@ extern void returns_input_benchmark_embind_js(); extern void sum_int_benchmark_embind_js(); extern void sum_float_benchmark_embind_js(); +extern void increment_class_counter_benchmark_embind_js(int N); } +class Foo +{ +public: + Foo() + :class_counter(0) + { + } + + void __attribute__((noinline)) incr_global_counter() + { + ++counter; + } + + void __attribute__((noinline)) incr_class_counter() + { + ++class_counter; + } + + int class_counter_val() const + { + return class_counter; + } + + int class_counter; +}; + EMSCRIPTEN_BINDINGS(benchmark) { using namespace emscripten; @@ -53,6 +80,12 @@ EMSCRIPTEN_BINDINGS(benchmark) function("returns_input", &returns_input); function("sum_int", &sum_int); function("sum_float", &sum_float); + + class_<Foo>("Foo") + .constructor<>() + .function("incr_global_counter", &Foo::incr_global_counter) + .function("incr_class_counter", &Foo::incr_class_counter) + .function("class_counter_val", &Foo::class_counter_val); } void __attribute__((noinline)) emscripten_get_now_benchmark(int N) @@ -95,6 +128,27 @@ void __attribute__((noinline)) increment_counter_benchmark(int N) printf("C++ increment_counter %d iters: %f msecs.\n", N, 1000.f*(t2-t)); } +void __attribute__((noinline)) increment_class_counter_benchmark(int N) +{ + Foo foo; + volatile float t = emscripten_get_now(); + for(int i = 0; i < N; ++i) + { + foo.incr_class_counter(); + foo.incr_class_counter(); + foo.incr_class_counter(); + foo.incr_class_counter(); + foo.incr_class_counter(); + foo.incr_class_counter(); + foo.incr_class_counter(); + foo.incr_class_counter(); + foo.incr_class_counter(); + foo.incr_class_counter(); + } + volatile float t2 = emscripten_get_now(); + printf("C++ increment_class_counter %d iters: %f msecs. result: %d\n", N, 1000.f*(t2-t), foo.class_counter); +} + void __attribute__((noinline)) returns_input_benchmark() { volatile int r = 0; @@ -172,6 +226,13 @@ int main() printf("\n"); } + for(int i = 1000; i <= 100000; i *= 10) + { + increment_class_counter_benchmark(i); + increment_class_counter_benchmark_embind_js(i); + printf("\n"); + } + returns_input_benchmark(); returns_input_benchmark_js(); returns_input_benchmark_embind_js(); |