Test name | Executions per second |
---|---|
Simple for loop | 6040.2 Ops/sec |
Extended for loop | 11658.2 Ops/sec |
Log based | 127897.6 Ops/sec |
Array approach | 1041.9 Ops/sec |
function repeatify(string, repetitions) {
if (repetitions < 0 || repetitions === Infinity) {
throw new RangeError('Invalid repetitions number');
}
let result = '';
for (let i = 0; i < repetitions; i++) {
result += string;
}
return result;
}
repeatify('*', 10000);
function repeatify2(string, repetitions) {
if (repetitions < 0 || repetitions === Infinity) {
throw new RangeError('Invalid repetitions number');
}
const isEven = repetitions % 2 === 0;
const iterations = Math.floor(repetitions / 2);
const stringTwice = string + string;
let result = '';
for (let i = 0; i < iterations; i++) {
result += stringTwice;
}
if (!isEven) {
result += string;
}
return result;
}
repeatify2('*', 10000);
function repeatify3(string, repetitions) {
if (repetitions < 0 || repetitions === Infinity) {
throw new RangeError('Invalid repetitions number');
}
const cache = new Map();
function repeat(string, repetitions) {
if (repetitions === 0) {
return '';
}
const log = Math.floor(Math.log2(repetitions));
let result;
if (cache.has(log)) {
result = cache.get(log);
} else {
result = string;
for (let i = 1; i <= log; i++) {
result += result;
cache.set(i, result);
}
}
const repetitionsProcessed = Math.pow(2, log);
const repetitionsLeft = repetitions - repetitionsProcessed;
return result + repeat(string, repetitionsLeft);
}
return repeat(string, repetitions);
}
repeatify3('*', 10000);
function repeatify4(string, repetitions) {
if (repetitions < 0 || repetitions === Infinity) {
throw new RangeError('Invalid repetitions number');
}
return Array(repetitions + 1).join(string);
}
repeatify4('*', 10000);