String concatenation (v10)

Revision 10 of this benchmark created on


Description

Testing string concatenation methods in straight code and abstracted in a StringBuilder

Preparation HTML

<script>

var CONST = {
    STR_PART: 'Hello Diggity Dog more more more more more more more more more more more more more more more more more more more',
    ITERATIONS: 30
};

function StringBuilderConcat() {
  this._str = "";
}

StringBuilderConcat.prototype.append = function (str) {
    this._str += str;
}

StringBuilderConcat.prototype.toString = function () {
  return this._str;
}

function StringBuilderArrayPush() {
    this._array = [];
}

StringBuilderArrayPush.prototype.append = function (str) {
    this._array.push(str);
}

StringBuilderArrayPush.prototype.toString = function () {
  return this._array.join('');
}

function StringBuilderArrayIndex() {
  this._array = [];
  this._index = 0;
}

StringBuilderArrayIndex.prototype.append = function (str) {
    this._array[this._index] = str;
    this._index++;
}

StringBuilderArrayIndex.prototype.toString = function () {
  return this._array.join('');
}

function StringBuilderHack(){
  this._a=[];
  this.append=Array.prototype.push.bind(this._a);
}
StringBuilderHack.prototype.toString=function(){
    var a=this._a, out=a[0];
    for (var i=1, l=a.length; i < l; i ++) {
      out+=a[i];
    }
    return out;
  }
function StringBuilderHack2(){
 this._a=[];
 this.append=Array.prototype.push.bind(this._a);
 this.toString=Array.prototype.join.bind(this._a, '');
}
var preparedArray = [];
for (var i=0; i < CONST.ITERATIONS; i ++) {
  preparedArray[preparedArray.length] = String.fromCharCode(i);
}

Array.prototype.joinAsString=function(){
  var out='';
  for (var i=0, l=this.length; i < l; i ++) {
    out+=this[i];
  }
  return out;
}
Array.prototype.join2=function(s){
  if(!this.length){
    return '';
  }
  var out=this[0];
  for (var i=1, l=this.length; i < l; i ++) {
    out+=s+this[i];
  }
  return out;
}
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
Array index - No Abstraction
var build = [];
for (var i = 0; i < CONST.ITERATIONS; i++) {
  build[i] = String.fromCharCode(i);
}
var out = build.join('');
ready
Array push - No abstraction
var build = [];
for (var i = 0; i < CONST.ITERATIONS; i++) {
  build.push(String.fromCharCode(i));
}

var out = build.join('');
ready
Straight String Concat - No abstraction
var build = "";
for (var i = 0; i < CONST.ITERATIONS; i++) {
  build += String.fromCharCode(i);
}
var out = build;
ready
StringBuilder - Array index
var builder = new StringBuilderArrayIndex();
for (var i = 0; i < CONST.ITERATIONS; i++) {
  builder.append(String.fromCharCode(i));
}
var out = builder.toString();
ready
StringBuilder - Array push
var builder = new StringBuilderArrayPush();
for (var i = 0; i < CONST.ITERATIONS; i++) {
  builder.append(String.fromCharCode(i));
}
var out = builder.toString();
ready
StringBuilder - string concat
var builder = new StringBuilderConcat();
for (var i = 0; i < CONST.ITERATIONS; i++) {
  builder.append(String.fromCharCode(i));
}
var out = builder.toString();
ready
StringBuilder - Hack Array
var builder = new StringBuilderHack();
for (var i = 0; i < CONST.ITERATIONS; i++) {
  builder.append(String.fromCharCode(i));
}
var out = builder.toString();
ready
StringBuilder - Hack Array2
var builder = new StringBuilderHack2();
for (var i = 0; i < CONST.ITERATIONS; i++) {
  builder.append(String.fromCharCode(i));
}
var out = builder.toString();
ready
Fair native +
var out = '';
for (var i = 0, l = preparedArray.length; i < l; i++) {
  out += preparedArray[i];
}
ready
Fair array.join
var out = preparedArray.join('');
ready
Fair join2
var out = preparedArray.join2('');
ready
Fair joinAsString
var out = preparedArray.joinAsString();
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.