benchmark: replace [].join() with ''.repeat()

Also add a benchmark to compare both ways to create strings.

PR-URL: https://github.com/nodejs/node/pull/12170
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
Vse Mozhet Byt 2017-04-03 00:32:50 +03:00 committed by James M Snell
parent 9348f31c2a
commit 74dc3bfe08
15 changed files with 63 additions and 28 deletions

View File

@ -40,11 +40,11 @@ function main(conf) {
var encoding;
switch (conf.type) {
case 'asc':
message = new Array(conf.len + 1).join('a');
message = 'a'.repeat(conf.len);
encoding = 'ascii';
break;
case 'utf':
message = new Array(conf.len / 2 + 1).join('ü');
message = 'ü'.repeat(conf.len / 2);
encoding = 'utf8';
break;
case 'buf':

View File

@ -25,11 +25,11 @@ function main(conf) {
var encoding;
switch (conf.type) {
case 'asc':
message = new Array(conf.len + 1).join('a');
message = 'a'.repeat(conf.len);
encoding = 'ascii';
break;
case 'utf':
message = new Array(conf.len / 2 + 1).join('ü');
message = 'ü'.repeat(conf.len / 2);
encoding = 'utf8';
break;
case 'buf':

View File

@ -24,11 +24,11 @@ function main(conf) {
var encoding;
switch (conf.type) {
case 'asc':
message = new Array(conf.len + 1).join('a');
message = 'a'.repeat(conf.len);
encoding = 'ascii';
break;
case 'utf':
message = new Array(conf.len / 2 + 1).join('ü');
message = 'ü'.repeat(conf.len / 2);
encoding = 'utf8';
break;
case 'buf':

View File

@ -0,0 +1,35 @@
'use strict';
const assert = require('assert');
const common = require('../common.js');
const configs = {
n: [1e3],
mode: ['Array', 'repeat'],
encoding: ['ascii', 'utf8'],
size: [1e1, 1e3, 1e6],
};
const bench = common.createBenchmark(main, configs);
function main(conf) {
const n = +conf.n;
const size = +conf.size;
const character = conf.encoding === 'ascii' ? 'a' : '\ud83d\udc0e'; // '🐎'
let str;
if (conf.mode === 'Array') {
bench.start();
for (let i = 0; i < n; i++)
str = new Array(size + 1).join(character);
bench.end(n);
} else {
bench.start();
for (let i = 0; i < n; i++)
str = character.repeat(size);
bench.end(n);
}
assert.strictEqual([...str].length, size);
}

View File

@ -24,11 +24,11 @@ function main(conf) {
chunk = Buffer.alloc(size, 'b');
break;
case 'asc':
chunk = new Array(size + 1).join('a');
chunk = 'a'.repeat(size);
encoding = 'ascii';
break;
case 'utf':
chunk = new Array(Math.ceil(size / 2) + 1).join('ü');
chunk = 'ü'.repeat(Math.ceil(size / 2));
encoding = 'utf8';
break;
default:

View File

@ -23,10 +23,10 @@ function main(conf) {
break;
case 'utf':
encoding = 'utf8';
chunk = new Array(len / 2 + 1).join('ü');
chunk = 'ü'.repeat(len / 2);
break;
case 'asc':
chunk = new Array(len + 1).join('a');
chunk = 'a'.repeat(len);
break;
}

View File

@ -26,10 +26,10 @@ function main(conf) {
chunk = Buffer.alloc(len, 'x');
break;
case 'utf':
chunk = new Array(len / 2 + 1).join('ü');
chunk = 'ü'.repeat(len / 2);
break;
case 'asc':
chunk = new Array(len + 1).join('a');
chunk = 'a'.repeat(len);
break;
}

View File

@ -27,11 +27,11 @@ function main(conf) {
break;
case 'utf':
encoding = 'utf8';
chunk = new Array(len / 2 + 1).join('ü');
chunk = 'ü'.repeat(len / 2);
break;
case 'asc':
encoding = 'ascii';
chunk = new Array(len + 1).join('x');
chunk = 'x'.repeat(len);
break;
default:
throw new Error('invalid type: ' + type);

View File

@ -27,11 +27,11 @@ function main(conf) {
break;
case 'utf':
encoding = 'utf8';
chunk = new Array(len / 2 + 1).join('ü');
chunk = 'ü'.repeat(len / 2);
break;
case 'asc':
encoding = 'ascii';
chunk = new Array(len + 1).join('x');
chunk = 'x'.repeat(len);
break;
default:
throw new Error('invalid type: ' + type);

View File

@ -27,11 +27,11 @@ function main(conf) {
break;
case 'utf':
encoding = 'utf8';
chunk = new Array(len / 2 + 1).join('ü');
chunk = 'ü'.repeat(len / 2);
break;
case 'asc':
encoding = 'ascii';
chunk = new Array(len + 1).join('x');
chunk = 'x'.repeat(len);
break;
default:
throw new Error('invalid type: ' + type);

View File

@ -27,11 +27,11 @@ function main(conf) {
break;
case 'utf':
encoding = 'utf8';
chunk = new Array(len / 2 + 1).join('ü');
chunk = 'ü'.repeat(len / 2);
break;
case 'asc':
encoding = 'ascii';
chunk = new Array(len + 1).join('x');
chunk = 'x'.repeat(len);
break;
default:
throw new Error('invalid type: ' + type);

View File

@ -83,10 +83,10 @@ function client() {
chunk = Buffer.alloc(len, 'x');
break;
case 'utf':
chunk = new Array(len / 2 + 1).join('ü');
chunk = 'ü'.repeat(len / 2);
break;
case 'asc':
chunk = new Array(len + 1).join('x');
chunk = 'x'.repeat(len);
break;
default:
throw new Error('invalid type: ' + type);

View File

@ -80,10 +80,10 @@ function client() {
chunk = Buffer.alloc(len, 'x');
break;
case 'utf':
chunk = new Array(len / 2 + 1).join('ü');
chunk = 'ü'.repeat(len / 2);
break;
case 'asc':
chunk = new Array(len + 1).join('x');
chunk = 'x'.repeat(len);
break;
default:
throw new Error('invalid type: ' + type);

View File

@ -54,10 +54,10 @@ function server() {
chunk = Buffer.alloc(len, 'x');
break;
case 'utf':
chunk = new Array(len / 2 + 1).join('ü');
chunk = 'ü'.repeat(len / 2);
break;
case 'asc':
chunk = new Array(len + 1).join('x');
chunk = 'x'.repeat(len);
break;
default:
throw new Error('invalid type: ' + type);

View File

@ -26,11 +26,11 @@ function main(conf) {
chunk = Buffer.alloc(size, 'b');
break;
case 'asc':
chunk = new Array(size + 1).join('a');
chunk = 'a'.repeat(size);
encoding = 'ascii';
break;
case 'utf':
chunk = new Array(size / 2 + 1).join('ü');
chunk = 'ü'.repeat(size / 2);
encoding = 'utf8';
break;
default: