summaryrefslogtreecommitdiff
path: root/benchmark/napi
diff options
context:
space:
mode:
Diffstat (limited to 'benchmark/napi')
-rw-r--r--benchmark/napi/function_call/.gitignore1
-rw-r--r--benchmark/napi/function_call/binding.cc14
-rw-r--r--benchmark/napi/function_call/binding.gyp12
-rw-r--r--benchmark/napi/function_call/index.js50
-rw-r--r--benchmark/napi/function_call/napi_binding.c26
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;
+}