diff --git a/benchmark/os/homedir.js b/benchmark/os/homedir.js new file mode 100644 index 00000000000000..d48f99dba18a2b --- /dev/null +++ b/benchmark/os/homedir.js @@ -0,0 +1,31 @@ +'use strict'; + +const common = require('../common.js'); +const homedir = require('os').homedir; +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [1e6], +}); + +function main({ n }) { + // Warm up. + const length = 1024; + const array = []; + for (let i = 0; i < length; ++i) { + array.push(homedir()); + } + + bench.start(); + for (let i = 0; i < n; ++i) { + const index = i % length; + array[index] = homedir(); + } + bench.end(n); + + // Verify the entries to prevent dead code elimination from making + // the benchmark invalid. + for (let i = 0; i < length; ++i) { + assert.strictEqual(typeof array[i], 'string'); + } +} diff --git a/benchmark/os/hostname.js b/benchmark/os/hostname.js new file mode 100644 index 00000000000000..9436f23af98c7a --- /dev/null +++ b/benchmark/os/hostname.js @@ -0,0 +1,31 @@ +'use strict'; + +const common = require('../common.js'); +const hostname = require('os').hostname; +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [1e6], +}); + +function main({ n }) { + // Warm up. + const length = 1024; + const array = []; + for (let i = 0; i < length; ++i) { + array.push(hostname()); + } + + bench.start(); + for (let i = 0; i < n; ++i) { + const index = i % length; + array[index] = hostname(); + } + bench.end(n); + + // Verify the entries to prevent dead code elimination from making + // the benchmark invalid. + for (let i = 0; i < length; ++i) { + assert.strictEqual(typeof array[i], 'string'); + } +} diff --git a/benchmark/os/uptime.js b/benchmark/os/uptime.js new file mode 100644 index 00000000000000..2f25dfe670b722 --- /dev/null +++ b/benchmark/os/uptime.js @@ -0,0 +1,31 @@ +'use strict'; + +const common = require('../common.js'); +const uptime = require('os').uptime; +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + n: [1e5], +}); + +function main({ n }) { + // Warm up. + const length = 1024; + const array = []; + for (let i = 0; i < length; ++i) { + array.push(uptime()); + } + + bench.start(); + for (let i = 0; i < n; ++i) { + const index = i % length; + array[index] = uptime(); + } + bench.end(n); + + // Verify the entries to prevent dead code elimination from making + // the benchmark invalid. + for (let i = 0; i < length; ++i) { + assert.strictEqual(typeof array[i], 'number'); + } +} diff --git a/lib/os.js b/lib/os.js index 34391697b5891c..cfc3b8e5bc2ecf 100644 --- a/lib/os.js +++ b/lib/os.js @@ -60,17 +60,6 @@ const { setPriority: _setPriority, } = internalBinding('os'); -function getCheckedFunction(fn) { - return hideStackFrames(function checkError(...args) { - const ctx = {}; - const ret = fn(...args, ctx); - if (ret === undefined) { - throw new ERR_SYSTEM_ERROR(ctx); - } - return ret; - }); -} - const { 0: type, 1: version, @@ -78,10 +67,41 @@ const { 3: machine, } = _getOSInformation(); -const getHomeDirectory = getCheckedFunction(_getHomeDirectory); -const getHostname = getCheckedFunction(_getHostname); -const getInterfaceAddresses = getCheckedFunction(_getInterfaceAddresses); -const getUptime = getCheckedFunction(_getUptime); +const getHomeDirectory = hideStackFrames(() => { + const ctx = {}; + const ret = _getHomeDirectory(ctx); + if (ret === undefined) { + throw new ERR_SYSTEM_ERROR(ctx); + } + return ret; +}); + +const getHostname = hideStackFrames(() => { + const ctx = {}; + const ret = _getHostname(ctx); + if (ret === undefined) { + throw new ERR_SYSTEM_ERROR(ctx); + } + return ret; +}); + +const getInterfaceAddresses = hideStackFrames(() => { + const ctx = {}; + const ret = _getInterfaceAddresses(ctx); + if (ret === undefined) { + throw new ERR_SYSTEM_ERROR(ctx); + } + return ret; +}); + +const getUptime = hideStackFrames(() => { + const ctx = {}; + const ret = _getUptime(ctx); + if (ret === undefined) { + throw new ERR_SYSTEM_ERROR(ctx); + } + return ret; +}); /** * @returns {string}