Mega trim test

JavaScript performance comparison

Revision 35 of this test case created by @ryn_j

Info

Trim function

Changes from /34:

Preparation code

<script>
  /*
Source of es5_shim(str): https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js
*/

  var es5_shim = function(){
    var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + "\u2029\uFEFF";
    ws = "[" + ws + "]";
    var trimBeginRegexp = new RegExp("^" + ws + ws + "*"),
        trimEndRegexp = new RegExp(ws + ws + "*$");
    return function(str) {
      return str.replace(trimBeginRegexp, "").replace(trimEndRegexp, "");
    };
  }();

  function trim28(str) {                      
    var c;                                    
    for (var i = 0; i < str.length; i++) {    
      c = str.charCodeAt(i);                  
      if(c < 8192) {
        if(c < 256 && (c == 32 || (c >= 9 && c <= 13) || c == 160)) continue;
        else if(c == 5760 || c == 6158) continue;
        break;
      } else if(c <= 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288) continue;
      break;
    }  
    for (var j = str.length - 1; j >= i; j--) {
      c = str.charCodeAt(j);
      if(c < 8192) {
        if(c < 256 && (c == 32 || (c >= 9 && c <= 13) || c == 160)) continue;                                                                                                                                    
        else if(c == 5760 || c == 6158) continue;
        break;
      } else if(c <= 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288) continue;
      break;
    }  
    return str.substring(i, j + 1);
  }

  function trim27a(str) {
    var c;
    for (var i = 0; i < str.length; i++) {
      c = str.charCodeAt(i);
      if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12 || c == 11 || c == 160 || c == 5760 || c == 6158 || c == 8192 || c == 8193 || c == 8194 || c == 8195 || c == 8196 || c == 8197 || c == 8198 || c == 8199 || c == 8200 || c == 8201 || c == 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288) continue;
      else break;
    }
    for (var j = str.length - 1; j >= i; j--) {
      c = str.charCodeAt(j);
      if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12 || c == 11 || c == 160 || c == 5760 || c == 6158 || c == 8192 || c == 8193 || c == 8194 || c == 8195 || c == 8196 || c == 8197 || c == 8198 || c == 8199 || c == 8200 || c == 8201 || c == 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288) continue;
      else break;
    }
    return str.substring(i, j + 1);
  }

  function trim27(str) {
    var c;
    for (var i = 0; i < str.length; i++) {
      c = str.charCodeAt(i);
      if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12) continue;
      else break;
    }
    for (var j = str.length - 1; j >= i; j--) {
      c = str.charCodeAt(j);
      if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12) continue;
      else break;
    }
    return str.substring(i, j + 1);
  }
 
  function trim27b(str) {
                        var c, len = str.length;
                        for (var i = 0; i < len; i++) {
                                c = str.charCodeAt(i);
                                if (c != 32 && c != 10 && c != 13 && c != 9 && c != 12) break;
                        }
                        for (var j = len - 1; j >= i; j--) {
                                c = str.charCodeAt(j);
                                if (c != 32 && c != 10 && c != 13 && c != 9 && c != 12) break;
                        }
                        return str.substring(i, j + 1);
  }

  function trim_native(str) {
    return str.trim(); // should throw is no such function
  }

  var inp = "    \n\n \n\n   a \n a\n  a\n    a\n   a  \n\t\ta\t\ta\njahsdkjahkjshdakjhsdkahskd akhsjdh akjshd kashdkajhsd kajshd \nkauyiuqhwep iasldk qpwoie ad  \n   askdjaslkdjaslkjdaoiur qowioqwhr aspodiquw ijasod iqwiue pqowipoqiw epoqiwpeo iaslkjdqur \t kjahsdkj hakshd\nkajhdk\nk as d  \t\n".split('\n');

var buffer = new Array(inp.length);

var correct = ["", "", "", "", "a", "a", "a", "a", "a", "a              a", "jahsdkjahkjshdakjhsdkahskd akhsjdh akjshd kashdkajhsd kajshd", "kauyiuqhwep iasldk qpwoie ad", "askdjaslkdjaslkjdaoiur qowioqwhr aspodiquw ijasod iqwiue pqowipoqiw epoqiwpeo iaslkjdqur    kjahsdkj hakshd", "kajhdk", "k as d", ""];

function e1() {
    for( var i = 0, len = inp.length; i < len; ++i ) {
        buffer[i] = trim_native(inp[i]);
    }
    return buffer;
}

function e2() {
    for( var i = 0, len = inp.length; i < len; ++i ) {
        buffer[i] = trim27(inp[i]);
    }
    return buffer;
}

function e3() {
    for( var i = 0, len = inp.length; i < len; ++i ) {
        buffer[i] = trim27a(inp[i]);
    }
    return buffer;
}

function e4() {
    for( var i = 0, len = inp.length; i < len; ++i ) {
        buffer[i] = trim28(inp[i]);
    }
    return buffer;
}

function e5() {
    for( var i = 0, len = inp.length; i < len; ++i ) {
        buffer[i] = es5_shim(inp[i]);
    }
    return buffer;
}

function e6() {
    for( var i = 0, len = inp.length; i < len; ++i ) {
        buffer[i] = trim27b(inp[i]);
    }
    return buffer;
}

var l = 10000;
while(l--) {
e1();
e2();
e3();
e4();
e5();
e6();
}
</script>
<script>
Benchmark.prototype.teardown = function() {
      for( var i = 0; i < correct.length; ++i ) {
        if( a[i] !== correct[i]) {
            throw new Error("invalid test");
        }
      }
};
</script>

Test runner

Warning! For accurate results, please disable Firebug before running the tests. (Why?)

Java applet disabled.

Testing in unknown unknown
Test Ops/sec
trim-native
var a = e1();
pending…
trim27
var a = e2();
pending…
trim27a
var a = e3();
pending…
trim28
var a = e4();
pending…
es5_shim
var a = e5();
pending…
trim27b
var a = e6();
pending…

Compare results of other browsers

Revisions

You can edit these tests or add even more tests to this page by appending /edit to the URL. Here’s a list of current revisions for this page:

0 comments

Add a comment