aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJukka Jylänki <jujjyl@gmail.com>2013-04-11 14:31:36 +0300
committerJukka Jylänki <jujjyl@gmail.com>2013-04-18 20:08:21 +0300
commitd9886ee985f8c2f5fd3f3ac8d88867d3895e3366 (patch)
treed52b1d9aa7e4ea8c453d806ced34ed76d4b27e91
parent9a310fb5b6043e93bc37ebb894b8487fc9fd7ef6 (diff)
Added synthetic benchmark for comparing class member function call in C++ and embind.
-rw-r--r--tests/embind/embind.benchmark.js20
-rw-r--r--tests/embind/embind_benchmark.cpp61
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();