Skip to content

Commit b7088a9

Browse files
mscdexMylesBorins
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 e5d1e27 commit b7088a9

File tree

5 files changed

+46
-21
lines changed

5 files changed

+46
-21
lines changed

benchmark/process/memoryUsage.js

Lines changed: 16 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848

4949
_process.setup_hrtime();
5050
_process.setup_cpuUsage();
51+
_process.setupMemoryUsage();
5152
_process.setupConfig(NativeModule._source);
5253
NativeModule.require('internal/process/warning').setup();
5354
NativeModule.require('internal/process/next_tick').setup();

lib/internal/process.js

Lines changed: 15 additions & 0 deletions
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;
@@ -100,6 +101,20 @@ function setup_hrtime() {
100101
};
101102
}
102103

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

104119
function setupConfig(_source) {
105120
// NativeModule._source

src/env.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ namespace node {
105105
V(exponent_string, "exponent") \
106106
V(exports_string, "exports") \
107107
V(ext_key_usage_string, "ext_key_usage") \
108-
V(external_string, "external") \
109108
V(external_stream_string, "_externalStream") \
110109
V(family_string, "family") \
111110
V(fatal_exception_string, "_fatalException") \
@@ -115,8 +114,6 @@ namespace node {
115114
V(flags_string, "flags") \
116115
V(gid_string, "gid") \
117116
V(handle_string, "handle") \
118-
V(heap_total_string, "heapTotal") \
119-
V(heap_used_string, "heapUsed") \
120117
V(homedir_string, "homedir") \
121118
V(hostmaster_string, "hostmaster") \
122119
V(ignore_string, "ignore") \
@@ -184,7 +181,6 @@ namespace node {
184181
V(rename_string, "rename") \
185182
V(replacement_string, "replacement") \
186183
V(retry_string, "retry") \
187-
V(rss_string, "rss") \
188184
V(serial_string, "serial") \
189185
V(scopeid_string, "scopeid") \
190186
V(sent_shutdown_string, "sentShutdown") \

src/node.cc

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2290,25 +2290,22 @@ void MemoryUsage(const FunctionCallbackInfo<Value>& args) {
22902290
return env->ThrowUVException(err, "uv_resident_set_memory");
22912291
}
22922292

2293+
Isolate* isolate = env->isolate();
22932294
// V8 memory usage
22942295
HeapStatistics v8_heap_stats;
2295-
env->isolate()->GetHeapStatistics(&v8_heap_stats);
2296-
2297-
Local<Number> heap_total =
2298-
Number::New(env->isolate(), v8_heap_stats.total_heap_size());
2299-
Local<Number> heap_used =
2300-
Number::New(env->isolate(), v8_heap_stats.used_heap_size());
2301-
Local<Number> external_mem =
2302-
Number::New(env->isolate(),
2303-
env->isolate()->AdjustAmountOfExternalAllocatedMemory(0));
2304-
2305-
Local<Object> info = Object::New(env->isolate());
2306-
info->Set(env->rss_string(), Number::New(env->isolate(), rss));
2307-
info->Set(env->heap_total_string(), heap_total);
2308-
info->Set(env->heap_used_string(), heap_used);
2309-
info->Set(env->external_string(), external_mem);
2310-
2311-
args.GetReturnValue().Set(info);
2296+
isolate->GetHeapStatistics(&v8_heap_stats);
2297+
2298+
// Get the double array pointer from the Float64Array argument.
2299+
CHECK(args[0]->IsFloat64Array());
2300+
Local<Float64Array> array = args[0].As<Float64Array>();
2301+
CHECK_EQ(array->Length(), 4);
2302+
Local<ArrayBuffer> ab = array->Buffer();
2303+
double* fields = static_cast<double*>(ab->GetContents().Data());
2304+
2305+
fields[0] = rss;
2306+
fields[1] = v8_heap_stats.total_heap_size();
2307+
fields[2] = v8_heap_stats.used_heap_size();
2308+
fields[3] = isolate->AdjustAmountOfExternalAllocatedMemory(0);
23122309
}
23132310

23142311

0 commit comments

Comments
 (0)