Skip to content

Commit 204248a

Browse files
committed
console: update time formatting
This improves the readability of the `console.timeEnd()` output while keeping a higher output's precision in multiple cases. Instead of e.g. '1.005min' it will print '1:00.300 (m:ss.mmm)'. PR-URL: #29629 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Michaël Zasso <[email protected]>
1 parent 3473e58 commit 204248a

File tree

3 files changed

+54
-39
lines changed

3 files changed

+54
-39
lines changed

lib/internal/console/constructor.js

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// The Console constructor is not actually used to construct the global
44
// console. It's exported for backwards compatibility.
55

6-
const { Object, ObjectPrototype, Reflect } = primordials;
6+
const { Object, ObjectPrototype, Reflect, Math } = primordials;
77

88
const { trace } = internalBinding('trace_events');
99
const {
@@ -533,22 +533,38 @@ function timeLogImpl(self, name, label, data) {
533533
return true;
534534
}
535535

536+
function pad(value) {
537+
return `${value}`.padStart(2, '0');
538+
}
539+
536540
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';
541+
let hours = 0;
542+
let minutes = 0;
543+
let seconds = 0;
544+
545+
if (ms >= kSecond) {
546+
if (ms >= kMinute) {
547+
if (ms >= kHour) {
548+
hours = Math.floor(ms / kHour);
549+
ms = ms % kHour;
550+
}
551+
minutes = Math.floor(ms / kMinute);
552+
ms = ms % kMinute;
553+
}
554+
seconds = ms / kSecond;
555+
}
556+
557+
if (hours !== 0 || minutes !== 0) {
558+
[seconds, ms] = seconds.toFixed(3).split('.');
559+
const res = hours !== 0 ? `${hours}:${pad(minutes)}` : minutes;
560+
return `${res}:${pad(seconds)}.${ms} (${hours !== 0 ? 'h:m' : ''}m:ss.mmm)`;
561+
}
562+
563+
if (seconds !== 0) {
564+
return `${seconds.toFixed(3)}s`;
549565
}
550566

551-
return value.toFixed(3) + unit;
567+
return `${Number(ms.toFixed(3))}ms`;
552568
}
553569

554570
const keyKey = 'Key';

test/parallel/test-console-formatTime.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@ require('../common');
44
const { formatTime } = require('internal/console/constructor');
55
const assert = require('assert');
66

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');
7+
assert.strictEqual(formatTime(100.0096), '100.01ms');
8+
assert.strictEqual(formatTime(100.0115), '100.011ms');
9+
assert.strictEqual(formatTime(1500.04), '1.500s');
10+
assert.strictEqual(formatTime(1000.056), '1.000s');
11+
assert.strictEqual(formatTime(60300.3), '1:00.300 (m:ss.mmm)');
12+
assert.strictEqual(formatTime(4000457.4), '1:06:40.457 (h:mm:ss.mmm)');
13+
assert.strictEqual(formatTime(3601310.4), '1:00:01.310 (h:mm:ss.mmm)');
14+
assert.strictEqual(formatTime(3213601017.6), '892:40:01.018 (h:mm:ss.mmm)');

test/parallel/test-console.js

Lines changed: 16 additions & 16 deletions
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|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()));
249+
assert.ok(/^label: \d+(\.\d{1,3})?(ms|s)$/.test(strings.shift().trim()));
250+
assert.ok(/^__proto__: \d+(\.\d{1,3})?(ms|s)$/.test(strings.shift().trim()));
251+
assert.ok(/^constructor: \d+(\.\d{1,3})?(ms|s)$/.test(strings.shift().trim()));
252+
assert.ok(/^hasOwnProperty: \d+(\.\d{1,3})?(ms|s)$/.test(strings.shift().trim()));
253253

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

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

0 commit comments

Comments
 (0)