Skip to content

Commit f90ad08

Browse files
benchmark: streamline object creation with properties and improve argument parsing
1 parent 508a4bd commit f90ad08

File tree

1 file changed

+58
-99
lines changed
  • benchmark/napi/create_object_with_properties

1 file changed

+58
-99
lines changed

benchmark/napi/create_object_with_properties/binding.cc

Lines changed: 58 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1,133 +1,92 @@
11
#include <assert.h>
22
#include <node_api.h>
3+
#include <string>
34

4-
// Creating with many options because complains are when ~20 properties
5-
static void CreateTestProperties(napi_env env,
6-
napi_value names[20],
7-
napi_value values[20]) {
8-
napi_create_string_utf8(env, "foo", NAPI_AUTO_LENGTH, &names[0]);
9-
napi_create_string_utf8(env, "value1", NAPI_AUTO_LENGTH, &values[0]);
10-
napi_create_string_utf8(env, "alpha", NAPI_AUTO_LENGTH, &names[1]);
11-
napi_create_int32(env, 100, &values[1]);
12-
napi_create_string_utf8(env, "beta", NAPI_AUTO_LENGTH, &names[2]);
13-
napi_get_boolean(env, true, &values[2]);
14-
napi_create_string_utf8(env, "gamma", NAPI_AUTO_LENGTH, &names[3]);
15-
napi_create_double(env, 3.14159, &values[3]);
16-
napi_create_string_utf8(env, "delta", NAPI_AUTO_LENGTH, &names[4]);
17-
napi_create_int32(env, 42, &values[4]);
18-
napi_create_string_utf8(env, "epsilon", NAPI_AUTO_LENGTH, &names[5]);
19-
napi_create_string_utf8(env, "test", NAPI_AUTO_LENGTH, &values[5]);
20-
napi_create_string_utf8(env, "zeta", NAPI_AUTO_LENGTH, &names[6]);
21-
napi_create_string_utf8(env, "data", NAPI_AUTO_LENGTH, &values[6]);
22-
napi_create_string_utf8(env, "eta", NAPI_AUTO_LENGTH, &names[7]);
23-
napi_create_string_utf8(env, "info", NAPI_AUTO_LENGTH, &values[7]);
24-
napi_create_string_utf8(env, "theta", NAPI_AUTO_LENGTH, &names[8]);
25-
napi_create_string_utf8(env, "sample", NAPI_AUTO_LENGTH, &values[8]);
26-
napi_create_string_utf8(env, "iota", NAPI_AUTO_LENGTH, &names[9]);
27-
napi_create_double(env, 2.71828, &values[9]);
28-
napi_create_string_utf8(env, "kappa", NAPI_AUTO_LENGTH, &names[10]);
29-
napi_create_string_utf8(env, "benchmark", NAPI_AUTO_LENGTH, &values[10]);
30-
napi_create_string_utf8(env, "lambda", NAPI_AUTO_LENGTH, &names[11]);
31-
napi_create_string_utf8(env, "result", NAPI_AUTO_LENGTH, &values[11]);
32-
napi_create_string_utf8(env, "mu", NAPI_AUTO_LENGTH, &names[12]);
33-
napi_create_string_utf8(env, "output", NAPI_AUTO_LENGTH, &values[12]);
34-
napi_create_string_utf8(env, "nu", NAPI_AUTO_LENGTH, &names[13]);
35-
napi_get_boolean(env, false, &values[13]);
36-
napi_create_string_utf8(env, "xi", NAPI_AUTO_LENGTH, &names[14]);
37-
napi_create_int32(env, 7, &values[14]);
38-
napi_create_string_utf8(env, "omicron", NAPI_AUTO_LENGTH, &names[15]);
39-
napi_create_double(env, 1.618, &values[15]);
40-
napi_create_string_utf8(env, "pi", NAPI_AUTO_LENGTH, &names[16]);
41-
napi_create_string_utf8(env, "config", NAPI_AUTO_LENGTH, &values[16]);
42-
napi_create_string_utf8(env, "rho", NAPI_AUTO_LENGTH, &names[17]);
43-
napi_create_int32(env, 999, &values[17]);
44-
napi_create_string_utf8(env, "sigma", NAPI_AUTO_LENGTH, &names[18]);
45-
napi_create_double(env, 0.577, &values[18]);
46-
napi_create_string_utf8(env, "tau", NAPI_AUTO_LENGTH, &names[19]);
47-
napi_get_boolean(env, true, &values[19]);
48-
}
5+
struct BenchmarkParams {
6+
napi_value count_val;
7+
napi_value bench_obj;
8+
napi_value start_fn;
9+
napi_value end_fn;
10+
uint32_t count;
11+
};
4912

50-
static napi_value CreateObjectWithPropertiesNew(napi_env env,
51-
napi_callback_info info) {
13+
static BenchmarkParams ParseBenchmarkArgs(napi_env env,
14+
const napi_callback_info info) {
15+
BenchmarkParams params;
5216
size_t argc = 4;
5317
napi_value args[4];
5418
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
5519

56-
napi_value count_val = args[0];
57-
napi_value bench_obj = args[1];
58-
napi_value start_fn = args[2];
59-
napi_value end_fn = args[3];
20+
params.count_val = args[0];
21+
params.bench_obj = args[1];
22+
params.start_fn = args[2];
23+
params.end_fn = args[3];
6024

61-
uint32_t count;
62-
napi_get_value_uint32(env, count_val, &count);
25+
napi_get_value_uint32(env, params.count_val, &params.count);
26+
return params;
27+
}
6328

64-
napi_value names[20];
65-
napi_value values[20];
66-
napi_value null_prototype;
29+
static napi_value global_names[20];
30+
static napi_value global_values[20];
31+
static bool global_properties_initialized = false;
32+
33+
// Creating with many options because complains are when ~20 properties
34+
static void InitializeTestProperties(napi_env env) {
35+
if (global_properties_initialized) return;
36+
37+
for (int i = 0; i < 20; i++) {
38+
std::string name = "foo" + std::to_string(i);
39+
napi_create_string_utf8(
40+
env, name.c_str(), NAPI_AUTO_LENGTH, &global_names[i]);
41+
napi_create_string_utf8(
42+
env, name.c_str(), NAPI_AUTO_LENGTH, &global_values[i]);
43+
}
44+
global_properties_initialized = true;
45+
}
6746

47+
static napi_value CreateObjectWithPropertiesNew(napi_env env,
48+
napi_callback_info info) {
49+
BenchmarkParams params = ParseBenchmarkArgs(env, info);
50+
51+
InitializeTestProperties(env);
52+
53+
napi_value null_prototype;
6854
napi_get_null(env, &null_prototype);
69-
CreateTestProperties(env, names, values);
7055

71-
napi_call_function(env, bench_obj, start_fn, 0, nullptr, nullptr);
56+
napi_call_function(
57+
env, params.bench_obj, params.start_fn, 0, nullptr, nullptr);
7258

73-
for (uint32_t i = 0; i < count; i++) {
59+
for (uint32_t i = 0; i < params.count; i++) {
7460
napi_value obj;
7561
napi_create_object_with_properties(
76-
env, null_prototype, names, values, 20, &obj);
62+
env, null_prototype, global_names, global_values, 20, &obj);
7763
}
7864

79-
napi_call_function(env, bench_obj, end_fn, 1, &count_val, nullptr);
65+
napi_call_function(
66+
env, params.bench_obj, params.end_fn, 1, &params.count_val, nullptr);
8067

8168
return nullptr;
8269
}
8370

8471
static napi_value CreateObjectWithPropertiesOld(napi_env env,
8572
napi_callback_info info) {
86-
size_t argc = 4;
87-
napi_value args[4];
88-
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
89-
90-
napi_value count_val = args[0];
91-
napi_value bench_obj = args[1];
92-
napi_value start_fn = args[2];
93-
napi_value end_fn = args[3];
94-
95-
uint32_t count;
96-
napi_get_value_uint32(env, count_val, &count);
97-
98-
napi_value names[20];
99-
napi_value values[20];
73+
BenchmarkParams params = ParseBenchmarkArgs(env, info);
10074

101-
CreateTestProperties(env, names, values);
75+
InitializeTestProperties(env);
10276

103-
napi_call_function(env, bench_obj, start_fn, 0, nullptr, nullptr);
77+
napi_call_function(
78+
env, params.bench_obj, params.start_fn, 0, nullptr, nullptr);
10479

105-
for (uint32_t i = 0; i < count; i++) {
80+
for (uint32_t i = 0; i < params.count; i++) {
10681
napi_value obj;
10782
napi_create_object(env, &obj);
108-
napi_set_property(env, obj, names[0], values[0]);
109-
napi_set_property(env, obj, names[1], values[1]);
110-
napi_set_property(env, obj, names[2], values[2]);
111-
napi_set_property(env, obj, names[3], values[3]);
112-
napi_set_property(env, obj, names[4], values[4]);
113-
napi_set_property(env, obj, names[5], values[5]);
114-
napi_set_property(env, obj, names[6], values[6]);
115-
napi_set_property(env, obj, names[7], values[7]);
116-
napi_set_property(env, obj, names[8], values[8]);
117-
napi_set_property(env, obj, names[9], values[9]);
118-
napi_set_property(env, obj, names[10], values[10]);
119-
napi_set_property(env, obj, names[11], values[11]);
120-
napi_set_property(env, obj, names[12], values[12]);
121-
napi_set_property(env, obj, names[13], values[13]);
122-
napi_set_property(env, obj, names[14], values[14]);
123-
napi_set_property(env, obj, names[15], values[15]);
124-
napi_set_property(env, obj, names[16], values[16]);
125-
napi_set_property(env, obj, names[17], values[17]);
126-
napi_set_property(env, obj, names[18], values[18]);
127-
napi_set_property(env, obj, names[19], values[19]);
83+
for (int j = 0; j < 20; j++) {
84+
napi_set_property(env, obj, global_names[j], global_values[j]);
85+
}
12886
}
12987

130-
napi_call_function(env, bench_obj, end_fn, 1, &count_val, nullptr);
88+
napi_call_function(
89+
env, params.bench_obj, params.end_fn, 1, &params.count_val, nullptr);
13190

13291
return nullptr;
13392
}

0 commit comments

Comments
 (0)