perf_hooks: move non-standard performance properties to perf_hooks · nodejs/node@3671851
@@ -120,6 +120,10 @@ the Resource Timeline. If `name` is provided, removes only the named resource.
120120added:
121121 - v14.10.0
122122 - v12.19.0
123+changes:
124+ - version: REPLACEME
125+ pr-url: https://github.com/nodejs/node/pull/60370
126+ description: Added `perf_hooks.eventLoopUtilization` alias.
123127-->
124128125129* `utilization1` {Object} The result of a previous call to
@@ -131,62 +135,9 @@ added:
131135* `active` {number}
132136* `utilization` {number}
133137134-The `eventLoopUtilization()` method returns an object that contains the
135-cumulative duration of time the event loop has been both idle and active as a
136-high resolution milliseconds timer. The `utilization` value is the calculated
137-Event Loop Utilization (ELU).
138-139-If bootstrapping has not yet finished on the main thread the properties have
140-the value of `0`. The ELU is immediately available on [Worker threads][] since
141-bootstrap happens within the event loop.
142-143-Both `utilization1` and `utilization2` are optional parameters.
144-145-If `utilization1` is passed, then the delta between the current call's `active`
146-and `idle` times, as well as the corresponding `utilization` value are
147-calculated and returned (similar to [`process.hrtime()`][]).
138+This is an alias of [`perf_hooks.eventLoopUtilization()`][].
148139149-If `utilization1` and `utilization2` are both passed, then the delta is
150-calculated between the two arguments. This is a convenience option because,
151-unlike [`process.hrtime()`][], calculating the ELU is more complex than a
152-single subtraction.
153-154-ELU is similar to CPU utilization, except that it only measures event loop
155-statistics and not CPU usage. It represents the percentage of time the event
156-loop has spent outside the event loop's event provider (e.g. `epoll_wait`).
157-No other CPU idle time is taken into consideration. The following is an example
158-of how a mostly idle process will have a high ELU.
159-160-```mjs
161-import { eventLoopUtilization } from 'node:perf_hooks';
162-import { spawnSync } from 'node:child_process';
163-164-setImmediate(() => {
165-const elu = eventLoopUtilization();
166-spawnSync('sleep', ['5']);
167-console.log(eventLoopUtilization(elu).utilization);
168-});
169-```
170-171-```cjs
172-'use strict';
173-const { eventLoopUtilization } = require('node:perf_hooks').performance;
174-const { spawnSync } = require('node:child_process');
175-176-setImmediate(() => {
177-const elu = eventLoopUtilization();
178-spawnSync('sleep', ['5']);
179-console.log(eventLoopUtilization(elu).utilization);
180-});
181-```
182-183-Although the CPU is mostly idle while running this script, the value of
184-`utilization` is `1`. This is because the call to
185-[`child_process.spawnSync()`][] blocks the event loop from proceeding.
186-187-Passing in a user-defined object instead of the result of a previous call to
188-`eventLoopUtilization()` will lead to undefined behavior. The return values
189-are not guaranteed to reflect any correct state of the event loop.
140+_This property is an extension by Node.js. It is not available in Web browsers._
190141191142### `performance.getEntries()`
192143@@ -424,6 +375,9 @@ which the current `node` process began, measured in Unix time.
424375<!-- YAML
425376added: v8.5.0
426377changes:
378+ - version: REPLACEME
379+ pr-url: https://github.com/nodejs/node/pull/60370
380+ description: Added `perf_hooks.timerify` alias.
427381 - version: v16.0.0
428382 pr-url: https://github.com/nodejs/node/pull/37475
429383 description: Added the histogram option.
@@ -439,62 +393,9 @@ changes:
439393`perf_hooks.createHistogram()` that will record runtime durations in
440394 nanoseconds.
441395442-_This property is an extension by Node.js. It is not available in Web browsers._
396+This is an alias of [`perf_hooks.timerify()`][].
443397444-Wraps a function within a new function that measures the running time of the
445-wrapped function. A `PerformanceObserver` must be subscribed to the `'function'`
446-event type in order for the timing details to be accessed.
447-448-```mjs
449-import { performance, PerformanceObserver } from 'node:perf_hooks';
450-451-function someFunction() {
452-console.log('hello world');
453-}
454-455-const wrapped = performance.timerify(someFunction);
456-457-const obs = new PerformanceObserver((list) => {
458-console.log(list.getEntries()[0].duration);
459-460-performance.clearMarks();
461-performance.clearMeasures();
462-obs.disconnect();
463-});
464-obs.observe({ entryTypes: ['function'] });
465-466-// A performance timeline entry will be created
467-wrapped();
468-```
469-470-```cjs
471-const {
472-performance,
473-PerformanceObserver,
474-} = require('node:perf_hooks');
475-476-function someFunction() {
477-console.log('hello world');
478-}
479-480-const wrapped = performance.timerify(someFunction);
481-482-const obs = new PerformanceObserver((list) => {
483-console.log(list.getEntries()[0].duration);
484-485-performance.clearMarks();
486-performance.clearMeasures();
487-obs.disconnect();
488-});
489-obs.observe({ entryTypes: ['function'] });
490-491-// A performance timeline entry will be created
492-wrapped();
493-```
494-495-If the wrapped function returns a promise, a finally handler will be attached
496-to the promise and the duration will be reported once the finally handler is
497-invoked.
398+_This property is an extension by Node.js. It is not available in Web browsers._
498399499400### `performance.toJSON()`
500401@@ -1722,6 +1623,78 @@ added:
1722162317231624Returns a {RecordableHistogram}.
172416251626+## `perf_hooks.eventLoopUtilization([utilization1[, utilization2]])`
1627+1628+<!-- YAML
1629+added: REPLACEME
1630+-->
1631+1632+* `utilization1` {Object} The result of a previous call to
1633+`eventLoopUtilization()`.
1634+* `utilization2` {Object} The result of a previous call to
1635+`eventLoopUtilization()` prior to `utilization1`.
1636+* Returns: {Object}
1637+* `idle` {number}
1638+* `active` {number}
1639+* `utilization` {number}
1640+1641+The `eventLoopUtilization()` function returns an object that contains the
1642+cumulative duration of time the event loop has been both idle and active as a
1643+high resolution milliseconds timer. The `utilization` value is the calculated
1644+Event Loop Utilization (ELU).
1645+1646+If bootstrapping has not yet finished on the main thread the properties have
1647+the value of `0`. The ELU is immediately available on [Worker threads][] since
1648+bootstrap happens within the event loop.
1649+1650+Both `utilization1` and `utilization2` are optional parameters.
1651+1652+If `utilization1` is passed, then the delta between the current call's `active`
1653+and `idle` times, as well as the corresponding `utilization` value are
1654+calculated and returned (similar to [`process.hrtime()`][]).
1655+1656+If `utilization1` and `utilization2` are both passed, then the delta is
1657+calculated between the two arguments. This is a convenience option because,
1658+unlike [`process.hrtime()`][], calculating the ELU is more complex than a
1659+single subtraction.
1660+1661+ELU is similar to CPU utilization, except that it only measures event loop
1662+statistics and not CPU usage. It represents the percentage of time the event
1663+loop has spent outside the event loop's event provider (e.g. `epoll_wait`).
1664+No other CPU idle time is taken into consideration. The following is an example
1665+of how a mostly idle process will have a high ELU.
1666+1667+```mjs
1668+import { eventLoopUtilization } from 'node:perf_hooks';
1669+import { spawnSync } from 'node:child_process';
1670+1671+setImmediate(() => {
1672+const elu = eventLoopUtilization();
1673+spawnSync('sleep', ['5']);
1674+console.log(eventLoopUtilization(elu).utilization);
1675+});
1676+```
1677+1678+```cjs
1679+'use strict';
1680+const { eventLoopUtilization } = require('node:perf_hooks');
1681+const { spawnSync } = require('node:child_process');
1682+1683+setImmediate(() => {
1684+const elu = eventLoopUtilization();
1685+spawnSync('sleep', ['5']);
1686+console.log(eventLoopUtilization(elu).utilization);
1687+});
1688+```
1689+1690+Although the CPU is mostly idle while running this script, the value of
1691+`utilization` is `1`. This is because the call to
1692+[`child_process.spawnSync()`][] blocks the event loop from proceeding.
1693+1694+Passing in a user-defined object instead of the result of a previous call to
1695+`eventLoopUtilization()` will lead to undefined behavior. The return values
1696+are not guaranteed to reflect any correct state of the event loop.
1697+17251698## `perf_hooks.monitorEventLoopDelay([options])`
1726169917271700<!-- YAML
@@ -1775,6 +1748,76 @@ console.log(h.percentile(50));
17751748console.log(h.percentile(99));
17761749```
177717501751+## `perf_hooks.timerify(fn[, options])`
1752+1753+<!-- YAML
1754+added: REPLACEME
1755+-->
1756+1757+* `fn` {Function}
1758+* `options` {Object}
1759+* `histogram` {RecordableHistogram} A histogram object created using
1760+`perf_hooks.createHistogram()` that will record runtime durations in
1761+ nanoseconds.
1762+1763+_This property is an extension by Node.js. It is not available in Web browsers._
1764+1765+Wraps a function within a new function that measures the running time of the
1766+wrapped function. A `PerformanceObserver` must be subscribed to the `'function'`
1767+event type in order for the timing details to be accessed.
1768+1769+```mjs
1770+import { timerify, performance, PerformanceObserver } from 'node:perf_hooks';
1771+1772+function someFunction() {
1773+console.log('hello world');
1774+}
1775+1776+const wrapped = timerify(someFunction);
1777+1778+const obs = new PerformanceObserver((list) => {
1779+console.log(list.getEntries()[0].duration);
1780+1781+performance.clearMarks();
1782+performance.clearMeasures();
1783+obs.disconnect();
1784+});
1785+obs.observe({ entryTypes: ['function'] });
1786+1787+// A performance timeline entry will be created
1788+wrapped();
1789+```
1790+1791+```cjs
1792+const {
1793+timerify,
1794+performance,
1795+PerformanceObserver,
1796+} = require('node:perf_hooks');
1797+1798+function someFunction() {
1799+console.log('hello world');
1800+}
1801+1802+const wrapped = timerify(someFunction);
1803+1804+const obs = new PerformanceObserver((list) => {
1805+console.log(list.getEntries()[0].duration);
1806+1807+performance.clearMarks();
1808+performance.clearMeasures();
1809+obs.disconnect();
1810+});
1811+obs.observe({ entryTypes: ['function'] });
1812+1813+// A performance timeline entry will be created
1814+wrapped();
1815+```
1816+1817+If the wrapped function returns a promise, a finally handler will be attached
1818+to the promise and the duration will be reported once the finally handler is
1819+invoked.
1820+17781821## Class: `Histogram`
1779182217801823<!-- YAML
@@ -2306,6 +2349,8 @@ dns.promises.resolve('localhost');
23062349[Worker threads]: worker_threads.md#worker-threads
23072350[`'exit'`]: process.md#event-exit
23082351[`child_process.spawnSync()`]: child_process.md#child_processspawnsynccommand-args-options
2352+[`perf_hooks.eventLoopUtilization()`]: #perf_hookseventlooputilizationutilization1-utilization2
2353+[`perf_hooks.timerify()`]: #perf_hookstimerifyfn-options
23092354[`process.hrtime()`]: process.md#processhrtimetime
23102355[`timeOrigin`]: https://w3c.github.io/hr-time/#dom-performance-timeorigin
23112356[`window.performance.toJSON`]: https://developer.mozilla.org/en-US/docs/Web/API/Performance/toJSON