Skip to content

Commit cdf5313

Browse files
node-api: add benchmark for new and old creation
1 parent 69ba24b commit cdf5313

File tree

4 files changed

+184
-0
lines changed

4 files changed

+184
-0
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
build/
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
#include <node_api.h>
2+
#include <assert.h>
3+
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+
}
49+
50+
static napi_value CreateObjectWithPropertiesNew(napi_env env,
51+
napi_callback_info info) {
52+
size_t argc = 4;
53+
napi_value args[4];
54+
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
55+
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];
60+
61+
uint32_t count;
62+
napi_get_value_uint32(env, count_val, &count);
63+
64+
napi_value names[20];
65+
napi_value values[20];
66+
napi_value null_prototype;
67+
68+
napi_get_null(env, &null_prototype);
69+
CreateTestProperties(env, names, values);
70+
71+
napi_call_function(env, bench_obj, start_fn, 0, nullptr, nullptr);
72+
73+
for (uint32_t i = 0; i < count; i++) {
74+
napi_value obj;
75+
napi_create_object_with_properties(env,
76+
null_prototype,
77+
names,
78+
values,
79+
20,
80+
&obj);
81+
}
82+
83+
napi_call_function(env, bench_obj, end_fn, 1, &count_val, nullptr);
84+
85+
return nullptr;
86+
}
87+
88+
static napi_value CreateObjectWithPropertiesOld(napi_env env,
89+
napi_callback_info info) {
90+
size_t argc = 4;
91+
napi_value args[4];
92+
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
93+
94+
napi_value count_val = args[0];
95+
napi_value bench_obj = args[1];
96+
napi_value start_fn = args[2];
97+
napi_value end_fn = args[3];
98+
99+
uint32_t count;
100+
napi_get_value_uint32(env, count_val, &count);
101+
102+
napi_value names[20];
103+
napi_value values[20];
104+
105+
CreateTestProperties(env, names, values);
106+
107+
napi_call_function(env, bench_obj, start_fn, 0, nullptr, nullptr);
108+
109+
for (uint32_t i = 0; i < count; i++) {
110+
napi_value obj;
111+
napi_create_object(env, &obj);
112+
napi_set_property(env, obj, names[0], values[0]);
113+
napi_set_property(env, obj, names[1], values[1]);
114+
napi_set_property(env, obj, names[2], values[2]);
115+
napi_set_property(env, obj, names[3], values[3]);
116+
napi_set_property(env, obj, names[4], values[4]);
117+
napi_set_property(env, obj, names[5], values[5]);
118+
napi_set_property(env, obj, names[6], values[6]);
119+
napi_set_property(env, obj, names[7], values[7]);
120+
napi_set_property(env, obj, names[8], values[8]);
121+
napi_set_property(env, obj, names[9], values[9]);
122+
napi_set_property(env, obj, names[10], values[10]);
123+
napi_set_property(env, obj, names[11], values[11]);
124+
napi_set_property(env, obj, names[12], values[12]);
125+
napi_set_property(env, obj, names[13], values[13]);
126+
napi_set_property(env, obj, names[14], values[14]);
127+
napi_set_property(env, obj, names[15], values[15]);
128+
napi_set_property(env, obj, names[16], values[16]);
129+
napi_set_property(env, obj, names[17], values[17]);
130+
napi_set_property(env, obj, names[18], values[18]);
131+
napi_set_property(env, obj, names[19], values[19]);
132+
}
133+
134+
napi_call_function(env, bench_obj, end_fn, 1, &count_val, nullptr);
135+
136+
return nullptr;
137+
}
138+
139+
NAPI_MODULE_INIT() {
140+
napi_property_descriptor desc[] = {
141+
{ "createObjectWithPropertiesNew", 0, CreateObjectWithPropertiesNew, 0, 0,
142+
0, napi_default, 0 },
143+
{ "createObjectWithPropertiesOld", 0, CreateObjectWithPropertiesOld, 0, 0,
144+
0, napi_default, 0 },
145+
};
146+
147+
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
148+
return exports;
149+
}
150+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
'targets': [
3+
{
4+
'target_name': 'binding',
5+
'sources': [ 'binding.cc' ],
6+
'defines': ['NAPI_VERSION=8']
7+
}
8+
]
9+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
'use strict';
2+
3+
const common = require('../../common.js');
4+
5+
let binding;
6+
try {
7+
binding = require(`./build/${common.buildType}/binding`);
8+
} catch {
9+
console.error(`${__filename}: Binding failed to load`);
10+
process.exit(0);
11+
}
12+
13+
const bench = common.createBenchmark(main, {
14+
n: [1e2, 1e3, 1e4, 1e5, 1e6],
15+
method: ['new', 'old'],
16+
});
17+
18+
function main({ n, method }) {
19+
if (method === 'new') {
20+
binding.createObjectWithPropertiesNew(n, bench, bench.start, bench.end);
21+
} else {
22+
binding.createObjectWithPropertiesOld(n, bench, bench.start, bench.end);
23+
}
24+
}

0 commit comments

Comments
 (0)