StringIsSubsetOf

JavaScript performance comparison

Test case created by Erik E

Info

From Check if a string can be made from the characters in another string in Javascript

Preparation code

 
<script>
Benchmark.prototype.setup = function() {
    if (!Array.prototype.indexOf) {
        Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
            "use strict";
            if (this == null) {
                throw new TypeError();
            }
            var t = Object(this);
            var len = t.length >>> 0;
            if (len === 0) {
                return -1;
            }
            var n = 0;
            if (arguments.length > 0) {
                n = Number(arguments[1]);
                if (n != n) { // shortcut for verifying if it's NaN
                    n = 0;
                } else if (n != 0 && n != Infinity && n != -Infinity) {
                    n = (n > 0 || -1) * Math.floor(Math.abs(n));
                }
            }
            if (n >= len) {
                return -1;
            }
            var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
            for (; k < len; k++) {
                if (k in t && t[k] === searchElement) {
                    return k;
                }
            }
            return -1;
        }
    }
   
    function dotests(fn) {
       fn('caramaba!', 'xyz'); //false
       fn('somnambulist', 'blastyousimmon!'); //true
       fn('friendly', 'denythereisafire'); // false
       fn('a', 'cba'); //true
       fn('zyxwvutsrqponmlkjihgfedcba', 'bcdefghijklmnopqrstuvwxyz'); //false
       fn('aaaaaaaaaaaaaaaaaaaa', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa') // true
    }
    function ErikE(elements, set) {
       var i, l = elements.length, pos;
       set = set.split('');
       for (i = 0; i < l; i += 1) {
          pos = set.indexOf(elements.charAt(i));
          if (pos == -1) return false;
          set.splice(pos, 1);
       }
       return true;
    }
   
    function ErikE2(elements, set) {
      var i, l, counts = {};
      for (i = 0, l = set.length; i < l; i += 1) {
         char = set.charAt(i);
         counts[char] = (counts[char] || 0) + 1;
      }
      for (i = 0, l = elements.length; i < l; i += 1) {
         char = elements.charAt(i);
         counts[char] -= 1;
         if (!counts[char]) return false;
      }
      return true;
    }
   
    function ErikE3(elements, sets) {
       var e, s, el = elements.length, sl = sets.length;
       elements = elements.split('').sort();
       sets = sets.split('').sort();
       for (e = 0, s = 0; e < el; e += 1, s += 1) {
          while (s < sl && sets[s] < elements[e]) { s += 1; }
          if (s == sl || sets[s] > elements[e]) { return false };
       }
       return true;
    }
   
    function GGG(needle, haystack) {
      var visited = {}, chr, i, re;
   
      for (i = needle.length; i--;) {
        chr = needle[i];
        if (visited[chr])
          continue;
        re = new RegExp(chr, 'g');
        if ((haystack.match(re) || []).length < (needle.match(re) || []).length)
          return false;
        visited[chr] = true;
      }
   
      return true;  
    }
    function Kolink(string1, string2) {
    var chars = {}, l = string2.length, i;
    for( i=0; i<l; i++) chars[string2[i]] = (chars[string2[i]] || 0)+1;
   
    l = string1.length;
    for( i=0; i<l; i++) {
        if( chars[string1[i]]) chars[string1[i]]--;
        else return false;
    }
    return true;
    }
    function user1522196(a, b){
        if(a.length > b.length){
            return false;
        }
   
        while(a.length > 0){
            var letter = a.substr(0, 1),
                re = new RegExp(a.substr(0, 1), 'g'),
                a_count = (a.match(re)||[]).length,
                b_count = (b.match(re)||[]).length;
   
            if(a_count > b_count){
                return false;
            }
   
            a = a.replace(re, '');
        }
        return true;
    }
   
};
</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
ErikE #1
dotests(ErikE);
pending…
ErikE #2
dotests(ErikE2);
pending…
ErikE #3
dotests(ErikE3);
pending…
user1522196
dotests(user1522196);
pending…
GGG
dotests(GGG);
pending…
Kolink
dotests(Kolink);
pending…

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

Compare results of other browsers

0 comments

Add a comment