Skip to content

Commit 66043e1

Browse files
Xstoudiaddaleax
authored andcommitted
console: display timeEnd with suitable time unit
When timeEnd function is called, display result with a suitable time unit instead of a big amount of milliseconds. Refs: #29099 PR-URL: #29251 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Colin Ihrig <[email protected]>
1 parent b3172f8 commit 66043e1

File tree

3 files changed

+60
-19
lines changed

3 files changed

+60
-19
lines changed

lib/internal/console/constructor.js

+29-3
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ const kTraceBegin = 'b'.charCodeAt(0);
3232
const kTraceEnd = 'e'.charCodeAt(0);
3333
const kTraceInstant = 'n'.charCodeAt(0);
3434

35+
const kSecond = 1000;
36+
const kMinute = 60 * kSecond;
37+
const kHour = 60 * kMinute;
38+
3539
const {
3640
isArray: ArrayIsArray,
3741
from: ArrayFrom,
@@ -518,14 +522,35 @@ function timeLogImpl(self, name, label, data) {
518522
}
519523
const duration = process.hrtime(time);
520524
const ms = duration[0] * 1000 + duration[1] / 1e6;
525+
526+
const formatted = formatTime(ms);
527+
521528
if (data === undefined) {
522-
self.log('%s: %sms', label, ms.toFixed(3));
529+
self.log('%s: %s', label, formatted);
523530
} else {
524-
self.log('%s: %sms', label, ms.toFixed(3), ...data);
531+
self.log('%s: %s', label, formatted, ...data);
525532
}
526533
return true;
527534
}
528535

536+
function formatTime(ms) {
537+
let value = ms;
538+
let unit = 'ms';
539+
540+
if (ms >= kHour) {
541+
value = ms / kHour;
542+
unit = 'h';
543+
} else if (ms >= kMinute) {
544+
value = ms / kMinute;
545+
unit = 'min';
546+
} else if (ms >= kSecond) {
547+
value = ms / kSecond;
548+
unit = 's';
549+
}
550+
551+
return value.toFixed(3) + unit;
552+
}
553+
529554
const keyKey = 'Key';
530555
const valuesKey = 'Values';
531556
const indexKey = '(index)';
@@ -547,5 +572,6 @@ Console.prototype.groupCollapsed = Console.prototype.group;
547572
module.exports = {
548573
Console,
549574
kBindStreamsLazy,
550-
kBindProperties
575+
kBindProperties,
576+
formatTime // exported for tests
551577
};
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
'use strict';
2+
// Flags: --expose-internals
3+
require('../common');
4+
const { formatTime } = require('internal/console/constructor');
5+
const assert = require('assert');
6+
7+
const test1 = formatTime(100);
8+
const test2 = formatTime(1500);
9+
const test3 = formatTime(60300);
10+
const test4 = formatTime(4000000);
11+
12+
assert.strictEqual(test1, '100.000ms');
13+
assert.strictEqual(test2, '1.500s');
14+
assert.strictEqual(test3, '1.005min');
15+
assert.strictEqual(test4, '1.111h');

test/parallel/test-console.js

+16-16
Original file line numberDiff line numberDiff line change
@@ -246,24 +246,24 @@ assert.ok(strings[0].includes('foo: { bar: { baz:'));
246246
assert.ok(strings[0].includes('quux'));
247247
assert.ok(strings.shift().includes('quux: true'));
248248

249-
assert.ok(/^label: \d+\.\d{3}ms$/.test(strings.shift().trim()));
250-
assert.ok(/^__proto__: \d+\.\d{3}ms$/.test(strings.shift().trim()));
251-
assert.ok(/^constructor: \d+\.\d{3}ms$/.test(strings.shift().trim()));
252-
assert.ok(/^hasOwnProperty: \d+\.\d{3}ms$/.test(strings.shift().trim()));
249+
assert.ok(/^label: \d+\.\d{3}(ms|s|min|h)$/.test(strings.shift().trim()));
250+
assert.ok(/^__proto__: \d+\.\d{3}(ms|s|min|h)$/.test(strings.shift().trim()));
251+
assert.ok(/^constructor: \d+\.\d{3}(ms|s|min|h)$/.test(strings.shift().trim()));
252+
assert.ok(/^hasOwnProperty: \d+\.\d{3}(ms|s|min|h)$/.test(strings.shift().trim()));
253253

254254
// Verify that console.time() coerces label values to strings as expected
255-
assert.ok(/^: \d+\.\d{3}ms$/.test(strings.shift().trim()));
256-
assert.ok(/^\[object Object\]: \d+\.\d{3}ms$/.test(strings.shift().trim()));
257-
assert.ok(/^\[object Object\]: \d+\.\d{3}ms$/.test(strings.shift().trim()));
258-
assert.ok(/^null: \d+\.\d{3}ms$/.test(strings.shift().trim()));
259-
assert.ok(/^default: \d+\.\d{3}ms$/.test(strings.shift().trim()));
260-
assert.ok(/^default: \d+\.\d{3}ms$/.test(strings.shift().trim()));
261-
assert.ok(/^NaN: \d+\.\d{3}ms$/.test(strings.shift().trim()));
262-
263-
assert.ok(/^log1: \d+\.\d{3}ms$/.test(strings.shift().trim()));
264-
assert.ok(/^log1: \d+\.\d{3}ms test$/.test(strings.shift().trim()));
265-
assert.ok(/^log1: \d+\.\d{3}ms {} \[ 1, 2, 3 ]$/.test(strings.shift().trim()));
266-
assert.ok(/^log1: \d+\.\d{3}ms$/.test(strings.shift().trim()));
255+
assert.ok(/^: \d+\.\d{3}(ms|s|min|h)$/.test(strings.shift().trim()));
256+
assert.ok(/^\[object Object\]: \d+\.\d{3}(ms|s|min|h)$/.test(strings.shift().trim()));
257+
assert.ok(/^\[object Object\]: \d+\.\d{3}(ms|s|min|h)$/.test(strings.shift().trim()));
258+
assert.ok(/^null: \d+\.\d{3}(ms|s|min|h)$/.test(strings.shift().trim()));
259+
assert.ok(/^default: \d+\.\d{3}(ms|s|min|h)$/.test(strings.shift().trim()));
260+
assert.ok(/^default: \d+\.\d{3}(ms|s|min|h)$/.test(strings.shift().trim()));
261+
assert.ok(/^NaN: \d+\.\d{3}(ms|s|min|h)$/.test(strings.shift().trim()));
262+
263+
assert.ok(/^log1: \d+\.\d{3}(ms|s|min|h)$/.test(strings.shift().trim()));
264+
assert.ok(/^log1: \d+\.\d{3}(ms|s|min|h) test$/.test(strings.shift().trim()));
265+
assert.ok(/^log1: \d+\.\d{3}(ms|s|min|h) {} \[ 1, 2, 3 ]$/.test(strings.shift().trim()));
266+
assert.ok(/^log1: \d+\.\d{3}(ms|s|min|h)$/.test(strings.shift().trim()));
267267

268268
// Make sure that we checked all strings
269269
assert.strictEqual(strings.length, 0);

0 commit comments

Comments
 (0)