console: implement timeLog method
Refs: https://github.com/whatwg/console/pull/138 PR-URL: https://github.com/nodejs/node/pull/21312 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: Anatoli Papirovski <apapirovski@mac.com> Reviewed-By: Weijia Wang <starkwang@126.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
7951e6d26b
commit
b016745e48
@ -413,6 +413,25 @@ console.timeEnd('100-elements');
|
|||||||
// prints 100-elements: 225.438ms
|
// prints 100-elements: 225.438ms
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### console.timeLog([label][, ...data])
|
||||||
|
<!-- YAML
|
||||||
|
added: REPLACEME
|
||||||
|
-->
|
||||||
|
* `label` {string} **Default:** `'default'`
|
||||||
|
* `...data` {any}
|
||||||
|
|
||||||
|
For a timer that was previously started by calling [`console.time()`][], prints
|
||||||
|
the elapsed time and other `data` arguments to `stdout`:
|
||||||
|
|
||||||
|
```js
|
||||||
|
console.time('process');
|
||||||
|
const value = expensiveProcess1(); // Returns 42
|
||||||
|
console.timeLog('process', value);
|
||||||
|
// Prints "process: 365.227ms 42".
|
||||||
|
doExpensiveProcess2(value);
|
||||||
|
console.timeEnd('process');
|
||||||
|
```
|
||||||
|
|
||||||
### console.trace([message][, ...args])
|
### console.trace([message][, ...args])
|
||||||
<!-- YAML
|
<!-- YAML
|
||||||
added: v0.1.104
|
added: v0.1.104
|
||||||
|
@ -235,18 +235,34 @@ Console.prototype.time = function time(label = 'default') {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Console.prototype.timeEnd = function timeEnd(label = 'default') {
|
Console.prototype.timeEnd = function timeEnd(label = 'default') {
|
||||||
|
const hasWarned = timeLogImpl(this, 'timeEnd', label);
|
||||||
|
if (!hasWarned) {
|
||||||
|
this._times.delete(label);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Console.prototype.timeLog = function timeLog(label, ...data) {
|
||||||
|
timeLogImpl(this, 'timeLog', label, data);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Returns true if label was not found
|
||||||
|
function timeLogImpl(self, name, label = 'default', data) {
|
||||||
// Coerces everything other than Symbol to a string
|
// Coerces everything other than Symbol to a string
|
||||||
label = `${label}`;
|
label = `${label}`;
|
||||||
const time = this._times.get(label);
|
const time = self._times.get(label);
|
||||||
if (!time) {
|
if (!time) {
|
||||||
process.emitWarning(`No such label '${label}' for console.timeEnd()`);
|
process.emitWarning(`No such label '${label}' for console.${name}()`);
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
const duration = process.hrtime(time);
|
const duration = process.hrtime(time);
|
||||||
const ms = duration[0] * 1000 + duration[1] / 1e6;
|
const ms = duration[0] * 1000 + duration[1] / 1e6;
|
||||||
this.log('%s: %sms', label, ms.toFixed(3));
|
if (data === undefined) {
|
||||||
this._times.delete(label);
|
self.log('%s: %sms', label, ms.toFixed(3));
|
||||||
};
|
} else {
|
||||||
|
self.log('%s: %sms', label, ms.toFixed(3), ...data);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Console.prototype.trace = function trace(...args) {
|
Console.prototype.trace = function trace(...args) {
|
||||||
const err = {
|
const err = {
|
||||||
|
@ -31,11 +31,18 @@ if (common.isMainThread) {
|
|||||||
assert.strictEqual(typeof process.stdout.fd, 'number');
|
assert.strictEqual(typeof process.stdout.fd, 'number');
|
||||||
assert.strictEqual(typeof process.stderr.fd, 'number');
|
assert.strictEqual(typeof process.stderr.fd, 'number');
|
||||||
}
|
}
|
||||||
process.once('warning', common.mustCall((warning) => {
|
|
||||||
assert(/no such label/.test(warning.message));
|
|
||||||
}));
|
|
||||||
|
|
||||||
console.timeEnd('no such label');
|
common.expectWarning(
|
||||||
|
'Warning',
|
||||||
|
[
|
||||||
|
['No such label \'nolabel\' for console.timeEnd()', common.noWarnCode],
|
||||||
|
['No such label \'nolabel\' for console.timeLog()', common.noWarnCode],
|
||||||
|
['Label \'test\' already exists for console.time()', common.noWarnCode]
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
console.timeEnd('nolabel');
|
||||||
|
console.timeLog('nolabel');
|
||||||
|
|
||||||
console.time('label');
|
console.time('label');
|
||||||
console.timeEnd('label');
|
console.timeEnd('label');
|
||||||
@ -144,15 +151,16 @@ console.timeEnd(NaN);
|
|||||||
console.time('test');
|
console.time('test');
|
||||||
const time = console._times.get('test');
|
const time = console._times.get('test');
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
common.expectWarning(
|
|
||||||
'Warning',
|
|
||||||
'Label \'test\' already exists for console.time()',
|
|
||||||
common.noWarnCode);
|
|
||||||
console.time('test');
|
console.time('test');
|
||||||
assert.deepStrictEqual(console._times.get('test'), time);
|
assert.deepStrictEqual(console._times.get('test'), time);
|
||||||
console.timeEnd('test');
|
console.timeEnd('test');
|
||||||
}, 1);
|
}, 1);
|
||||||
|
|
||||||
|
console.time('log1');
|
||||||
|
console.timeLog('log1');
|
||||||
|
console.timeLog('log1', 'test');
|
||||||
|
console.timeLog('log1', {}, [1, 2, 3]);
|
||||||
|
console.timeEnd('log1');
|
||||||
|
|
||||||
console.assert(false, '%s should', 'console.assert', 'not throw');
|
console.assert(false, '%s should', 'console.assert', 'not throw');
|
||||||
assert.strictEqual(errStrings[errStrings.length - 1],
|
assert.strictEqual(errStrings[errStrings.length - 1],
|
||||||
@ -219,6 +227,14 @@ assert.ok(/^default: \d+\.\d{3}ms$/.test(strings.shift().trim()));
|
|||||||
assert.ok(/^default: \d+\.\d{3}ms$/.test(strings.shift().trim()));
|
assert.ok(/^default: \d+\.\d{3}ms$/.test(strings.shift().trim()));
|
||||||
assert.ok(/^NaN: \d+\.\d{3}ms$/.test(strings.shift().trim()));
|
assert.ok(/^NaN: \d+\.\d{3}ms$/.test(strings.shift().trim()));
|
||||||
|
|
||||||
|
assert.ok(/^log1: \d+\.\d{3}ms$/.test(strings.shift().trim()));
|
||||||
|
assert.ok(/^log1: \d+\.\d{3}ms test$/.test(strings.shift().trim()));
|
||||||
|
assert.ok(/^log1: \d+\.\d{3}ms {} \[ 1, 2, 3 ]$/.test(strings.shift().trim()));
|
||||||
|
assert.ok(/^log1: \d+\.\d{3}ms$/.test(strings.shift().trim()));
|
||||||
|
|
||||||
|
// Make sure that we checked all strings
|
||||||
|
assert.strictEqual(strings.length, 0);
|
||||||
|
|
||||||
assert.strictEqual(errStrings.shift().split('\n').shift(),
|
assert.strictEqual(errStrings.shift().split('\n').shift(),
|
||||||
'Trace: This is a {"formatted":"trace"} 10 foo');
|
'Trace: This is a {"formatted":"trace"} 10 foo');
|
||||||
|
|
||||||
@ -229,6 +245,6 @@ common.hijackStderr(common.mustCall(function(data) {
|
|||||||
|
|
||||||
// stderr.write will catch sync error, so use `process.nextTick` here
|
// stderr.write will catch sync error, so use `process.nextTick` here
|
||||||
process.nextTick(function() {
|
process.nextTick(function() {
|
||||||
assert.strictEqual(data.includes('no such label'), true);
|
assert.strictEqual(data.includes('nolabel'), true);
|
||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user