Browse Source

os: improve loadavg() performance

PR-URL: https://github.com/nodejs/node/pull/11516
Reviewed-By: Jackson Tian <shyvo1987@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
v6
Brian White 8 years ago
parent
commit
efdc571a58
No known key found for this signature in database GPG Key ID: 606D7358F94DA209
  1. 17
      benchmark/os/loadavg.js
  2. 8
      lib/os.js
  3. 14
      src/node_os.cc

17
benchmark/os/loadavg.js

@ -0,0 +1,17 @@
'use strict';
const common = require('../common.js');
const loadavg = require('os').loadavg;
const bench = common.createBenchmark(main, {
n: [5e6]
});
function main(conf) {
const n = +conf.n;
bench.start();
for (var i = 0; i < n; ++i)
loadavg();
bench.end(n);
}

8
lib/os.js

@ -1,12 +1,12 @@
'use strict';
const binding = process.binding('os');
const getLoadAvg = binding.getLoadAvg;
const constants = process.binding('constants').os;
const internalUtil = require('internal/util');
const isWindows = process.platform === 'win32';
exports.hostname = binding.getHostname;
exports.loadavg = binding.getLoadAvg;
exports.uptime = binding.getUptime;
exports.freemem = binding.getFreeMem;
exports.totalmem = binding.getTotalMem;
@ -17,6 +17,12 @@ exports.networkInterfaces = binding.getInterfaceAddresses;
exports.homedir = binding.getHomeDirectory;
exports.userInfo = binding.getUserInfo;
const avgValues = new Float64Array(3);
exports.loadavg = function loadavg() {
getLoadAvg(avgValues);
return [avgValues[0], avgValues[1], avgValues[2]];
};
Object.defineProperty(exports, 'constants', {
configurable: false,
enumerable: true,

14
src/node_os.cc

@ -28,8 +28,10 @@ namespace node {
namespace os {
using v8::Array;
using v8::ArrayBuffer;
using v8::Boolean;
using v8::Context;
using v8::Float64Array;
using v8::FunctionCallbackInfo;
using v8::Integer;
using v8::Local;
@ -182,14 +184,12 @@ static void GetUptime(const FunctionCallbackInfo<Value>& args) {
static void GetLoadAvg(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
double loadavg[3];
CHECK(args[0]->IsFloat64Array());
Local<Float64Array> array = args[0].As<Float64Array>();
CHECK_EQ(array->Length(), 3);
Local<ArrayBuffer> ab = array->Buffer();
double* loadavg = static_cast<double*>(ab->GetContents().Data());
uv_loadavg(loadavg);
Local<Array> loads = Array::New(env->isolate(), 3);
loads->Set(0, Number::New(env->isolate(), loadavg[0]));
loads->Set(1, Number::New(env->isolate(), loadavg[1]));
loads->Set(2, Number::New(env->isolate(), loadavg[2]));
args.GetReturnValue().Set(loads);
}

Loading…
Cancel
Save