Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian White <mscdex@mscdex.net>2017-02-22 10:03:49 +0300
committerItalo A. Casas <me@italoacasas.com>2017-02-25 20:05:22 +0300
commit54e1f0c219827a8a17e0cab3fa0018e96562e9d1 (patch)
tree5670c45af9ca76d0ac6ef0e2b1f6c1757d17383c
parent842ac583f6df969d40f7f875471c9851f1f14930 (diff)
process: improve memoryUsage() performance
Creating an object in JS and using a typed array to transfer values from C++ to JS is faster than creating an object and setting properties in C++. The included benchmark shows ~34% increase in performance with this change. PR-URL: https://github.com/nodejs/node/pull/11497 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
-rw-r--r--benchmark/process/memoryUsage.js16
-rw-r--r--lib/internal/bootstrap_node.js1
-rw-r--r--lib/internal/process.js15
-rw-r--r--src/env.h4
-rw-r--r--src/node.cc31
5 files changed, 46 insertions, 21 deletions
diff --git a/benchmark/process/memoryUsage.js b/benchmark/process/memoryUsage.js
new file mode 100644
index 00000000000..d68ef339b4d
--- /dev/null
+++ b/benchmark/process/memoryUsage.js
@@ -0,0 +1,16 @@
+'use strict';
+
+var common = require('../common.js');
+var bench = common.createBenchmark(main, {
+ n: [1e5]
+});
+
+function main(conf) {
+ var n = +conf.n;
+
+ bench.start();
+ for (var i = 0; i < n; i++) {
+ process.memoryUsage();
+ }
+ bench.end(n);
+}
diff --git a/lib/internal/bootstrap_node.js b/lib/internal/bootstrap_node.js
index be069d67a31..12faa6bf00a 100644
--- a/lib/internal/bootstrap_node.js
+++ b/lib/internal/bootstrap_node.js
@@ -38,6 +38,7 @@
_process.setup_hrtime();
_process.setup_cpuUsage();
+ _process.setupMemoryUsage();
_process.setupConfig(NativeModule._source);
NativeModule.require('internal/process/warning').setup();
NativeModule.require('internal/process/next_tick').setup();
diff --git a/lib/internal/process.js b/lib/internal/process.js
index a756f0d429c..0f514a50e31 100644
--- a/lib/internal/process.js
+++ b/lib/internal/process.js
@@ -11,6 +11,7 @@ function lazyConstants() {
exports.setup_cpuUsage = setup_cpuUsage;
exports.setup_hrtime = setup_hrtime;
+exports.setupMemoryUsage = setupMemoryUsage;
exports.setupConfig = setupConfig;
exports.setupKillAndExit = setupKillAndExit;
exports.setupSignalHandlers = setupSignalHandlers;
@@ -98,6 +99,20 @@ function setup_hrtime() {
};
}
+function setupMemoryUsage() {
+ const memoryUsage_ = process.memoryUsage;
+ const memValues = new Float64Array(4);
+
+ process.memoryUsage = function memoryUsage() {
+ memoryUsage_(memValues);
+ return {
+ rss: memValues[0],
+ heapTotal: memValues[1],
+ heapUsed: memValues[2],
+ external: memValues[3]
+ };
+ };
+}
function setupConfig(_source) {
// NativeModule._source
diff --git a/src/env.h b/src/env.h
index 581d7e9aef3..b3bc79d4ce9 100644
--- a/src/env.h
+++ b/src/env.h
@@ -106,7 +106,6 @@ namespace node {
V(exponent_string, "exponent") \
V(exports_string, "exports") \
V(ext_key_usage_string, "ext_key_usage") \
- V(external_string, "external") \
V(external_stream_string, "_externalStream") \
V(family_string, "family") \
V(fatal_exception_string, "_fatalException") \
@@ -117,8 +116,6 @@ namespace node {
V(get_string, "get") \
V(gid_string, "gid") \
V(handle_string, "handle") \
- V(heap_total_string, "heapTotal") \
- V(heap_used_string, "heapUsed") \
V(homedir_string, "homedir") \
V(hostmaster_string, "hostmaster") \
V(ignore_string, "ignore") \
@@ -186,7 +183,6 @@ namespace node {
V(rename_string, "rename") \
V(replacement_string, "replacement") \
V(retry_string, "retry") \
- V(rss_string, "rss") \
V(serial_string, "serial") \
V(scopeid_string, "scopeid") \
V(sent_shutdown_string, "sentShutdown") \
diff --git a/src/node.cc b/src/node.cc
index 2f470ddda0a..23630471d24 100644
--- a/src/node.cc
+++ b/src/node.cc
@@ -2247,25 +2247,22 @@ void MemoryUsage(const FunctionCallbackInfo<Value>& args) {
return env->ThrowUVException(err, "uv_resident_set_memory");
}
+ Isolate* isolate = env->isolate();
// V8 memory usage
HeapStatistics v8_heap_stats;
- env->isolate()->GetHeapStatistics(&v8_heap_stats);
-
- Local<Number> heap_total =
- Number::New(env->isolate(), v8_heap_stats.total_heap_size());
- Local<Number> heap_used =
- Number::New(env->isolate(), v8_heap_stats.used_heap_size());
- Local<Number> external_mem =
- Number::New(env->isolate(),
- env->isolate()->AdjustAmountOfExternalAllocatedMemory(0));
-
- Local<Object> info = Object::New(env->isolate());
- info->Set(env->rss_string(), Number::New(env->isolate(), rss));
- info->Set(env->heap_total_string(), heap_total);
- info->Set(env->heap_used_string(), heap_used);
- info->Set(env->external_string(), external_mem);
-
- args.GetReturnValue().Set(info);
+ isolate->GetHeapStatistics(&v8_heap_stats);
+
+ // Get the double array pointer from the Float64Array argument.
+ CHECK(args[0]->IsFloat64Array());
+ Local<Float64Array> array = args[0].As<Float64Array>();
+ CHECK_EQ(array->Length(), 4);
+ Local<ArrayBuffer> ab = array->Buffer();
+ double* fields = static_cast<double*>(ab->GetContents().Data());
+
+ fields[0] = rss;
+ fields[1] = v8_heap_stats.total_heap_size();
+ fields[2] = v8_heap_stats.used_heap_size();
+ fields[3] = isolate->AdjustAmountOfExternalAllocatedMemory(0);
}