Skip to content

Commit fe8c582

Browse files
committed
Add new passgameobject_ptr embind benchmark to test smartptr routing in and out of functions.
1 parent 6f8af49 commit fe8c582

2 files changed

Lines changed: 52 additions & 0 deletions

File tree

tests/embind/embind.benchmark.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,30 @@ function _move_gameobjects_benchmark_embind_js() {
195195
var t = objects[i]['GetTransform']();
196196
accum = Module['add'](Module['add'](accum, t['GetPosition']()), t['GetRotation']());
197197
t['delete']();
198+
objects[i]['delete']();
198199
}
199200

200201
Module.print("JS embind move_gameobjects " + N + " iters: " + (b-a) + " msecs. Result: " + (accum[0] + accum[1] + accum[2]));
201202
}
203+
204+
function _pass_gameobject_ptr_benchmark_embind_js() {
205+
var N = 100000;
206+
var objects = [];
207+
for(i = 0; i < N; ++i) {
208+
objects.push(Module['create_game_object']());
209+
}
210+
211+
var a = _emscripten_get_now();
212+
for(i = 0; i < N; ++i) {
213+
var t = Module['pass_gameobject_ptr'](objects[i]);
214+
t['delete']();
215+
}
216+
var b = _emscripten_get_now();
217+
218+
for(i = 0; i < N; ++i) {
219+
objects[i]['delete']();
220+
}
221+
222+
Module.print("JS embind pass_gameobject_ptr " + N + " iters: " + (b-a) + " msecs.");
223+
}
224+

tests/embind/embind_benchmark.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ extern void sum_float_benchmark_embind_js();
4545

4646
extern void increment_class_counter_benchmark_embind_js(int N);
4747
extern 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

5053
class 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+
97105
class Foo
98106
{
99107
public:
@@ -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+
309335
int 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

Comments
 (0)