@@ -45,6 +45,9 @@ extern void sum_float_benchmark_embind_js();
4545
4646extern void increment_class_counter_benchmark_embind_js (int N);
4747extern void move_gameobjects_benchmark_embind_js ();
48+
49+ extern void pass_gameobject_ptr_benchmark ();
50+ extern void pass_gameobject_ptr_benchmark_embind_js ();
4851}
4952
5053class Vec3
@@ -94,6 +97,11 @@ GameObjectPtr create_game_object()
9497 return std::make_shared<GameObject>();
9598}
9699
100+ GameObjectPtr __attribute__ ((noinline)) pass_gameobject_ptr(GameObjectPtr p)
101+ {
102+ return p;
103+ }
104+
97105class Foo
98106{
99107public:
@@ -143,6 +151,7 @@ EMSCRIPTEN_BINDINGS(benchmark)
143151 .element (&Vec3::z);
144152
145153 function (" create_game_object" , &create_game_object);
154+ function (" pass_gameobject_ptr" , &pass_gameobject_ptr);
146155 function (" add" , &add);
147156
148157 function (" get_counter" , &get_counter);
@@ -306,6 +315,23 @@ void __attribute__((noinline)) move_gameobjects_benchmark()
306315 printf (" C++ move_gameobjects %d iters: %f msecs. Result: %f\n " , N, (t2-t), accum.x +accum.y +accum.z );
307316}
308317
318+ void __attribute__ ((noinline)) pass_gameobject_ptr_benchmark()
319+ {
320+ const int N = 100000 ;
321+ GameObjectPtr objects[N];
322+ for (int i = 0 ; i < N; ++i)
323+ objects[i] = create_game_object ();
324+
325+ volatile float t = emscripten_get_now ();
326+ for (int i = 0 ; i < N; ++i)
327+ {
328+ objects[i] = pass_gameobject_ptr (objects[i]);
329+ }
330+ volatile float t2 = emscripten_get_now ();
331+
332+ printf (" C++ pass_gameobject_ptr %d iters: %f msecs.\n " , N, (t2-t));
333+ }
334+
309335int main ()
310336{
311337 for (int i = 1000 ; i <= 100000 ; i *= 10 )
@@ -341,4 +367,7 @@ int main()
341367 printf (" \n " );
342368 move_gameobjects_benchmark ();
343369 move_gameobjects_benchmark_embind_js ();
370+ printf (" \n " );
371+ pass_gameobject_ptr_benchmark ();
372+ pass_gameobject_ptr_benchmark_embind_js ();
344373}
0 commit comments