diff options
Diffstat (limited to 'benchmark/napi')
-rw-r--r-- | benchmark/napi/function_call/.gitignore | 1 | ||||
-rw-r--r-- | benchmark/napi/function_call/binding.cc | 14 | ||||
-rw-r--r-- | benchmark/napi/function_call/binding.gyp | 12 | ||||
-rw-r--r-- | benchmark/napi/function_call/index.js | 50 | ||||
-rw-r--r-- | benchmark/napi/function_call/napi_binding.c | 26 |
5 files changed, 103 insertions, 0 deletions
diff --git a/benchmark/napi/function_call/.gitignore b/benchmark/napi/function_call/.gitignore new file mode 100644 index 0000000000..567609b123 --- /dev/null +++ b/benchmark/napi/function_call/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/benchmark/napi/function_call/binding.cc b/benchmark/napi/function_call/binding.cc new file mode 100644 index 0000000000..289a94ac3e --- /dev/null +++ b/benchmark/napi/function_call/binding.cc @@ -0,0 +1,14 @@ +#include <v8.h> +#include <node.h> + +static int c = 0; + +void Hello(const v8::FunctionCallbackInfo<v8::Value>& args) { + args.GetReturnValue().Set(c++); +} + +void Initialize(v8::Local<v8::Object> target) { + NODE_SET_METHOD(target, "hello", Hello); +} + +NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize) diff --git a/benchmark/napi/function_call/binding.gyp b/benchmark/napi/function_call/binding.gyp new file mode 100644 index 0000000000..ac122ed1a0 --- /dev/null +++ b/benchmark/napi/function_call/binding.gyp @@ -0,0 +1,12 @@ +{ + 'targets': [ + { + 'target_name': 'napi_binding', + 'sources': [ 'napi_binding.c' ] + }, + { + 'target_name': 'binding', + 'sources': [ 'binding.cc' ] + } + ] +} diff --git a/benchmark/napi/function_call/index.js b/benchmark/napi/function_call/index.js new file mode 100644 index 0000000000..cbc512c972 --- /dev/null +++ b/benchmark/napi/function_call/index.js @@ -0,0 +1,50 @@ +// show the difference between calling a short js function +// relative to a comparable C++ function. +// Reports n of calls per second. +// Note that JS speed goes up, while cxx speed stays about the same. +'use strict'; + +const assert = require('assert'); +const common = require('../../common.js'); + +// this fails when we try to open with a different version of node, +// which is quite common for benchmarks. so in that case, just +// abort quietly. + +try { + var binding = require('./build/Release/binding'); +} catch (er) { + console.error('misc/function_call.js Binding failed to load'); + process.exit(0); +} +const cxx = binding.hello; + +let napi_binding; +try { + napi_binding = require('./build/Release/napi_binding'); +} catch (er) { + console.error('misc/function_call/index.js NAPI-Binding failed to load'); + process.exit(0); +} +const napi = napi_binding.hello; + +var c = 0; +function js() { + return c++; +} + +assert(js() === cxx()); + +const bench = common.createBenchmark(main, { + type: ['js', 'cxx', 'napi'], + n: [1e6, 1e7, 5e7] +}); + +function main({ n, type }) { + const fn = type === 'cxx' ? cxx : type === 'napi' ? napi : js; + bench.start(); + for (var i = 0; i < n; i++) { + fn(); + } + bench.end(n); +} diff --git a/benchmark/napi/function_call/napi_binding.c b/benchmark/napi/function_call/napi_binding.c new file mode 100644 index 0000000000..d97170e0fc --- /dev/null +++ b/benchmark/napi/function_call/napi_binding.c @@ -0,0 +1,26 @@ +#include <assert.h> +#include <node_api.h> + +static int32_t increment = 0; + +static napi_value Hello(napi_env env, napi_callback_info info) { + napi_value result; + napi_status status = napi_create_int32(env, increment++, &result); + assert(status == napi_ok); + return result; +} + +NAPI_MODULE_INIT() { + napi_value hello; + napi_status status = + napi_create_function(env, + "hello", + NAPI_AUTO_LENGTH, + Hello, + NULL, + &hello); + assert(status == napi_ok); + status = napi_set_named_property(env, exports, "hello", hello); + assert(status == napi_ok); + return exports; +} |