Mega trim test

JavaScript performance comparison

Revision 23 of this test case created by

Info

Trim function

Preparation code

<script>
  function trim0(str) {
    return str.replace(/^(\s*)/, '').replace(/\s*$/, '');
  }

  function trim1(str) {
    return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
  }

  function trim2(str) {
    return str.replace(/^\s+/, '').replace(/\s+$/, '');
  }

  function trim3(str) {
    return str.substring(Math.max(str.search(/\S/), 0), str.search(/\S\s*$/) + 1);
  }

  function trim4(str) {
    return str.replace(/^\s+|\s+$/g, '');
  }

  function trim5(s) {
    var str = s.match(/\S+(?:\s+\S+)*/);
    return str ? str[0] : '';
  }

  function trim6(str) {
    return str.replace(/^\s*(\S*(\s+\S+)*)\s*$/, '$1');
  }

  function trim7(str) {
    return str.replace(/^\s*(\S*(?:\s+\S+)*)\s*$/, '$1');
  }

  function trim8(str) {
    return str.replace(/^\s*((?:[\S\s]*\S)?)\s*$/, '$1');
  }

  function trim9(str) {
    return str.replace(/^\s*([\S\s]*?)\s*$/, '$1');
  }

  var trim10_whitespace = ' \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000';

  function trim10(s) {
    var str = s;
    for (var i = 0; i < str.length; i++) {
      if (trim10_whitespace.indexOf(str.charAt(i)) === -1) {
        str = str.substring(i);
        break;
      }
    }
    for (i = str.length - 1; i >= 0; i--) {
      if (trim10_whitespace.indexOf(str.charAt(i)) === -1) {
        str = str.substring(0, i + 1);
        break;
      }
    }
    return trim10_whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
  }

  function trim11(s) {
    var str = s.replace(/^\s+/, '');
    for (var i = str.length - 1; i >= 0; i--) {
      if (/\S/.test(str.charAt(i))) {
        str = str.substring(0, i + 1);
        break;
      }
    }
    return str;
  }

  function trim12(s) {
    var str = s.replace(/^\s\s*/, ""),
        ws = /\s/,
        i = str.length;
    while (ws.test(str.charAt(--i)));
    return str.slice(0, i + 1);
  }
  // trim12 with \s+ insteas od \s\s*


  function trim13(s) {
    var str = s.replace(/^\s+/, ""),
        ws = /\s/,
        i = str.length;
    while (ws.test(str.charAt(--i)));
    return str.slice(0, i + 1);
  }
  // trim12 without single ws=/\s/


  function trim14(s) {
    var str = s.replace(/^\s\s*/, ""),
        i = str.length;
    while (/\s/.test(str.charAt(--i)));
    return str.slice(0, i + 1);
  }

  // same as trim11, but > not >=
  // buggy for "a " in Chromium


  function trim15(str) {
    str = str.replace(/^\s+/, '');
    for (var i = str.length - 1; i > 0; i--) {
      if (/\S/.test(str.charAt(i))) {
        str = str.substring(0, i + 1);
        break;
      }
    }
    return str;
  }
  trim15.buggy = true;

  // trim12 on http://zanstra.com/base/blog/trim_mac_roundup
  var trim16_whitespace = ' \n\r\t\v\f\u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000';

  function trim16(s) {
    var i = 0,
        j = s.length - 1;
    while (i < s.length && trim16_whitespace.indexOf(s.charAt(i)) != -1)
    i++;
    while (j > i && trim16_whitespace.indexOf(s.charAt(j)) != -1)
    j--;
    return s.substring(i, j + 1);
  }

  // trim12 in http://blog.stevenlevithan.com/archives/faster-trim-javascript#comment-13585
  // looks to be buggy in Opera and Chromium. Works ok in Epiphany.
  // buggy for " ala ma " in Chromium
  // buggy for "ala ma " in Chromium


  function trim17(str) {
    var str1 = str.replace(/^\s\s*/, '');
    var len = str1.length;
    if (len && /\s/.test(str1.charAt(len - 1))) {
      var re = /.*\S/g;
      re.test(str1);
      str1 = str1.slice(0, re.lastIndex);
    }
    return str1;
  }
  trim17.buggy = true;

  // trim in http://blog.stevenlevithan.com/archives/faster-trim-javascript#comment-39371
  // slightly changed return
  //var trim18_whitespace = trim21_whitespace;


  function trim18(str) {
    var len = str.length;
    if (len) {
      while (trim21_whitespace[str.charCodeAt(--len)]);
      if (++len) {
        var i = 0;
        while (trim21_whitespace[str.charCodeAt(i)]) {
          ++i;
        }
      }
      return str.substring(i, len);
    }
    return str;
  }

  // http://blog.stevenlevithan.com/archives/faster-trim-javascript#comment-21439


  function trim19(str) {
    var ws = /\s/,
        _start = 0,
        end = str.length;
    while (ws.test(str.charAt(_start++)));
    while (ws.test(str.charAt(--end)));
    return str.slice(_start - 1, end + 1);
  }

  // http://blog.stevenlevithan.com/archives/faster-trim-javascript#comment-28776


  function trim20(str) {
    var whitespace = " \n\r\t\f";
    for (var i = 0; i < str.length; i++)
    if (whitespace.indexOf(str.charAt(i)) < 0) break;

    for (var j = str.length - 1; j >= i; j--)
    if (whitespace.indexOf(str.charAt(j)) < 0) break;

    return str.substring(i, j + 1);
  }

  // in original it was manually populated, but looping is nicer
  var trim21_whitespace = {};
  var trim21_ww = [
  0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x0020, 0x0085, 0x00a0, 0x1680, 0x180e, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200a, 0x200b, 0x2028, 0x2029, 0x202f, 0x205f, 0x3000];
  for (var i = 0; i < trim21_ww.length; i++) {
    trim21_whitespace[trim21_ww[i]] = true;
  }
  // http://blog.stevenlevithan.com/archives/faster-trim-javascript#comment-25052
  // looks to be buggy as it returns different results than others in Epiphany, Chromium (correct in Opera)
  // bug for "  a"
  // buggy for  ' 40. To no one will we sell.'  in Chromium


  function trim21(str) {
    var n = str.length;
    var s = trim21_whitespace;
    var i;
    if (!n) return str;
    if (n && s[str.charCodeAt(n - 1)]) {
      do {--n;
      } while (n && s[str.charCodeAt(n - 1)]);
      if (n && s[str.charCodeAt(0)]) {
        i = 1;
        while (i < n && s[str.charCodeAt(i)])++i;
      }
      return str.substring(i, n);
    }
    if (n && s[str.charCodeAt(0)]) {
      i = 1;
      while (i < n && s[str.charAt(i)])++i;
      return str.substring(i, n);
    }
    return str;
  };
  trim21.buggy = true;

  // rialto framework, http://blog.stevenlevithan.com/archives/faster-trim-javascript#comment-25038
  // VERY looks to be buggy as it returns different results than others in Epiphany, Chromium, Opera (in Opera even differently)
  // bug for " ", ' 40. To no one. ', '40. To no one. '


  function trim22(str) {
    return str.replace(/^\s*(\b.*\b|)\s*$/, '$1');
  }
  trim22.buggy = true;

  // http://blog.stevenlevithan.com/archives/faster-trim-javascript#comment-13585
  // slightly moded return
  // looks to be buggy in Chromium (correct in Opera and Epiphany)
  // buggy for " ala ma " in Chromium
  // buggy for "ala ma " in Chromium


  function trim23(s) {
    var str = s.replace(/^\s\s*/, ''),
        len = str.length;
    if (len && /\s/.test(str.charAt(len - 1))) {
      var re = /.*\S/g;
      re.test(str);
      return str.slice(0, re.lastIndex);
    } else {
      return str;
    }
  }
  trim23.buggy = true;

  // http://blog.stevenlevithan.com/archives/faster-trim-javascript#comment-6808
  this.trim24 = (function() {
    var ws = {},
        chars = ' \n\r\t\v\f\u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000';
    for (var i = 0; i < chars.length; i++)
    ws[chars.charAt(i)] = true;

    return function(str) {
      var s = -1,
          e = str.length;
      while (ws[str.charAt(--e)]);
      while (s++ !== e && ws[str.charAt(s)]);
      return str.substring(s, e + 1);
    };
  })();

  // http://blog.stevenlevithan.com/archives/faster-trim-javascript#comment-6169


  function trim25(s) {
    var str = s.replace(/^\s+/, '');
    for (var i = str.length; i--;)
    if (/\S/.test(str.charAt(i))) return str.substring(0, ++i)
    return str
  }

  // bug for "  s"


  function trim26(str) {
    return str.replace(/^\s*(\S.*\S)?\s*$/, '$1');
  }
  trim26.buggy = true;



  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');

  function e(f) {
    var x = [];
    for (i = 0; i < inp.length; i++) {
      x.push(f(inp[i]));
    }
    return x;
  }
</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
trim1
e(trim1);
pending…
trim2
e(trim2);
pending…
trim3
e(trim3);
pending…
trim4
e(trim4);
pending…
trim5
e(trim5);
pending…
trim6
e(trim6);
pending…
trim7
e(trim7);
pending…
trim8
e(trim8);
pending…
trim9
e(trim9);
pending…
trim10
e(trim10);
pending…
trim11
e(trim11);
pending…
trim12
e(trim12);
pending…
trim13
e(trim13);
pending…
trim14
e(trim14);
pending…
trim15
e(trim15);
pending…
trim16
e(trim16);
pending…
trim17
e(trim17);
pending…
trim18
e(trim18);
pending…
trim19
e(trim19);
pending…
trim20
e(trim20);
pending…
trim21
e(trim21);
pending…
trim22
e(trim22);
pending…
trim23
e(trim23);
pending…
trim0
e(trim0);
pending…
new trim Right
function rightTrim(x, i) {
  i = --str.length;
  while (++str[i]) i--;
  return str.slice(0, ++i)
}
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