◐ Shell
clean mode source ↗

node-api: add property keys benchmark · nodejs/node@ac58c82

1+

#include <node_api.h>

2+

#include <stdio.h>

3+

#include <stdlib.h>

4+5+

#define NODE_API_CALL(call) \

6+

do { \

7+

napi_status status = call; \

8+

if (status != napi_ok) { \

9+

fprintf(stderr, #call " failed: %d\n", status); \

10+

abort(); \

11+

} \

12+

} while (0)

13+14+

#define ABORT_IF_FALSE(condition) \

15+

if (!(condition)) { \

16+

fprintf(stderr, #condition " failed\n"); \

17+

abort(); \

18+

}

19+20+

static napi_value Runner(napi_env env,

21+

napi_callback_info info,

22+

napi_value property_key) {

23+

napi_value argv[2], undefined, js_array_length, start, end;

24+

size_t argc = 2;

25+

napi_valuetype val_type = napi_undefined;

26+

bool is_array = false;

27+

uint32_t array_length = 0;

28+

napi_value* native_array;

29+30+

// Validate params and retrieve start and end function.

31+

NODE_API_CALL(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));

32+

ABORT_IF_FALSE(argc == 2);

33+

NODE_API_CALL(napi_typeof(env, argv[0], &val_type));

34+

ABORT_IF_FALSE(val_type == napi_object);

35+

NODE_API_CALL(napi_is_array(env, argv[1], &is_array));

36+

ABORT_IF_FALSE(is_array);

37+

NODE_API_CALL(napi_get_array_length(env, argv[1], &array_length));

38+

NODE_API_CALL(napi_get_named_property(env, argv[0], "start", &start));

39+

NODE_API_CALL(napi_typeof(env, start, &val_type));

40+

ABORT_IF_FALSE(val_type == napi_function);

41+

NODE_API_CALL(napi_get_named_property(env, argv[0], "end", &end));

42+

NODE_API_CALL(napi_typeof(env, end, &val_type));

43+

ABORT_IF_FALSE(val_type == napi_function);

44+45+

NODE_API_CALL(napi_get_undefined(env, &undefined));

46+

NODE_API_CALL(napi_create_uint32(env, array_length, &js_array_length));

47+48+

// Copy objects into a native array.

49+

native_array =

50+

static_cast<napi_value*>(malloc(array_length * sizeof(napi_value)));

51+

for (uint32_t idx = 0; idx < array_length; idx++) {

52+

NODE_API_CALL(napi_get_element(env, argv[1], idx, &native_array[idx]));

53+

}

54+55+

// Start the benchmark.

56+

napi_call_function(env, argv[0], start, 0, nullptr, nullptr);

57+58+

for (uint32_t idx = 0; idx < array_length; idx++) {

59+

NODE_API_CALL(

60+

napi_set_property(env, native_array[idx], property_key, undefined));

61+

}

62+63+

// Conclude the benchmark.

64+

NODE_API_CALL(

65+

napi_call_function(env, argv[0], end, 1, &js_array_length, nullptr));

66+67+

free(native_array);

68+69+

return undefined;

70+

}

71+72+

static napi_value RunPropertyKey(napi_env env, napi_callback_info info) {

73+

napi_value property_key;

74+

NODE_API_CALL(node_api_create_property_key_utf16(

75+

env, u"prop", NAPI_AUTO_LENGTH, &property_key));

76+

return Runner(env, info, property_key);

77+

}

78+79+

static napi_value RunNormalString(napi_env env, napi_callback_info info) {

80+

napi_value property_key;

81+

NODE_API_CALL(

82+

napi_create_string_utf16(env, u"prop", NAPI_AUTO_LENGTH, &property_key));

83+

return Runner(env, info, property_key);

84+

}

85+86+

NAPI_MODULE_INIT() {

87+

napi_property_descriptor props[] = {

88+

{"RunPropertyKey",

89+

nullptr,

90+

RunPropertyKey,

91+

nullptr,

92+

nullptr,

93+

nullptr,

94+

static_cast<napi_property_attributes>(napi_writable | napi_configurable |

95+

napi_enumerable),

96+

nullptr},

97+

{"RunNormalString",

98+

nullptr,

99+

RunNormalString,

100+

nullptr,

101+

nullptr,

102+

nullptr,

103+

static_cast<napi_property_attributes>(napi_writable | napi_configurable |

104+

napi_enumerable),

105+

nullptr},

106+

};

107+108+

NODE_API_CALL(napi_define_properties(

109+

env, exports, sizeof(props) / sizeof(*props), props));

110+

return exports;

111+

}