Skip to content

Commit 54e1f0c

Browse files
mscdexitaloacasas
authored andcommitted
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: #11497 Reviewed-By: Ben Noordhuis <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Jeremiah Senkpiel <[email protected]> Reviewed-By: Colin Ihrig <[email protected]>
1 parent 842ac58 commit 54e1f0c

File tree

5 files changed

+46
-21
lines changed

5 files changed

+46
-21
lines changed

benchmark/process/memoryUsage.js

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
'use strict';
2+
3+
var common = require('../common.js');
4+
var bench = common.createBenchmark(main, {
5+
n: [1e5]
6+
});
7+
8+
function main(conf) {
9+
var n = +conf.n;
10+
11+
bench.start();
12+
for (var i = 0; i < n; i++) {
13+
process.memoryUsage();
14+
}
15+
bench.end(n);
16+
}

lib/internal/bootstrap_node.js

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838

3939
_process.setup_hrtime();
4040
_process.setup_cpuUsage();
41+
_process.setupMemoryUsage();
4142
_process.setupConfig(NativeModule._source);
4243
NativeModule.require('internal/process/warning').setup();
4344
NativeModule.require('internal/process/next_tick').setup();

lib/internal/process.js

+15
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ function lazyConstants() {
1111

1212
exports.setup_cpuUsage = setup_cpuUsage;
1313
exports.setup_hrtime = setup_hrtime;
14+
exports.setupMemoryUsage = setupMemoryUsage;
1415
exports.setupConfig = setupConfig;
1516
exports.setupKillAndExit = setupKillAndExit;
1617
exports.setupSignalHandlers = setupSignalHandlers;
@@ -98,6 +99,20 @@ function setup_hrtime() {
9899
};
99100
}
100101

102+
function setupMemoryUsage() {
103+
const memoryUsage_ = process.memoryUsage;
104+
const memValues = new Float64Array(4);
105+
106+
process.memoryUsage = function memoryUsage() {
107+
memoryUsage_(memValues);
108+
return {
109+
rss: memValues[0],
110+
heapTotal: memValues[1],
111+
heapUsed: memValues[2],
112+
external: memValues[3]
113+
};
114+
};
115+
}
101116

102117
function setupConfig(_source) {
103118
// NativeModule._source

src/env.h

-4
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ namespace node {
106106
V(exponent_string, "exponent") \
107107
V(exports_string, "exports") \
108108
V(ext_key_usage_string, "ext_key_usage") \
109-
V(external_string, "external") \
110109
V(external_stream_string, "_externalStream") \
111110
V(family_string, "family") \
112111
V(fatal_exception_string, "_fatalException") \
@@ -117,8 +116,6 @@ namespace node {
117116
V(get_string, "get") \
118117
V(gid_string, "gid") \
119118
V(handle_string, "handle") \
120-
V(heap_total_string, "heapTotal") \
121-
V(heap_used_string, "heapUsed") \
122119
V(homedir_string, "homedir") \
123120
V(hostmaster_string, "hostmaster") \
124121
V(ignore_string, "ignore") \
@@ -186,7 +183,6 @@ namespace node {
186183
V(rename_string, "rename") \
187184
V(replacement_string, "replacement") \
188185
V(retry_string, "retry") \
189-
V(rss_string, "rss") \
190186
V(serial_string, "serial") \
191187
V(scopeid_string, "scopeid") \
192188
V(sent_shutdown_string, "sentShutdown") \

src/node.cc

+14-17
Original file line numberDiff line numberDiff line change
@@ -2247,25 +2247,22 @@ void MemoryUsage(const FunctionCallbackInfo<Value>& args) {
22472247
return env->ThrowUVException(err, "uv_resident_set_memory");
22482248
}
22492249

2250+
Isolate* isolate = env->isolate();
22502251
// V8 memory usage
22512252
HeapStatistics v8_heap_stats;
2252-
env->isolate()->GetHeapStatistics(&v8_heap_stats);
2253-
2254-
Local<Number> heap_total =
2255-
Number::New(env->isolate(), v8_heap_stats.total_heap_size());
2256-
Local<Number> heap_used =
2257-
Number::New(env->isolate(), v8_heap_stats.used_heap_size());
2258-
Local<Number> external_mem =
2259-
Number::New(env->isolate(),
2260-
env->isolate()->AdjustAmountOfExternalAllocatedMemory(0));
2261-
2262-
Local<Object> info = Object::New(env->isolate());
2263-
info->Set(env->rss_string(), Number::New(env->isolate(), rss));
2264-
info->Set(env->heap_total_string(), heap_total);
2265-
info->Set(env->heap_used_string(), heap_used);
2266-
info->Set(env->external_string(), external_mem);
2267-
2268-
args.GetReturnValue().Set(info);
2253+
isolate->GetHeapStatistics(&v8_heap_stats);
2254+
2255+
// Get the double array pointer from the Float64Array argument.
2256+
CHECK(args[0]->IsFloat64Array());
2257+
Local<Float64Array> array = args[0].As<Float64Array>();
2258+
CHECK_EQ(array->Length(), 4);
2259+
Local<ArrayBuffer> ab = array->Buffer();
2260+
double* fields = static_cast<double*>(ab->GetContents().Data());
2261+
2262+
fields[0] = rss;
2263+
fields[1] = v8_heap_stats.total_heap_size();
2264+
fields[2] = v8_heap_stats.used_heap_size();
2265+
fields[3] = isolate->AdjustAmountOfExternalAllocatedMemory(0);
22692266
}
22702267

22712268

0 commit comments

Comments
 (0)