ddfdqsfqdsfdsfqds

JavaScript performance comparison

Test case created

Preparation code

<script src="http://underscorejs.org/underscore.js"></script>
 
<script>
Benchmark.prototype.setup = function() {
    Benchmark.prototype.setup = (function(lib) {    
   
    "use strict";  
     
    var internal,
        domInstances = ['HTMLCollection', 'NodeList', 'Node', 'HTMLElement'],  
        fnNameRegex = /function (\w*)/,
        fnBind = Function.prototype.bind,      
        hasOwn = Object.prototype.hasOwnProperty,
        toStr = Object.prototype.toString,
        objKeys = Object.keys,
        arrForEach = Array.prototype.forEach,
        arrSome = Array.prototype.some,
        arrEvery = Array.prototype.every,
        arrReduce = Array.prototype.reduce,  
        arrMap = Array.prototype.map,
        arrFilter = Array.prototype.filter,
        arrSlice = Array.prototype.slice,
        arrIndexOf = Array.prototype.indexOf,
        arrLastIndexOf = Array.prototype.lastIndexOf,
        strIndexOf = String.prototype.indexOf,
        isObject = "[object Object]";
   
    internal = {
        isDOMElement: function(o) {
            if (!o) { return; }    
            return domInstances.indexOf(o.constructor.toString().match(fnNameRegex)[1]) !== -1;
        }
    };
                         
    lib.type = function(o) {
        if (internal.isDOMElement(o)) { return "domelement"; }
        return toStr.call(o).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
    };    
   
    lib.bind = function(fn, context) {
        var args = arrSlice.call(arguments, 1);        
        if (!!fnBind) { return fnBind.bind.apply(fn, args); }
        args = arrSlice.call(arguments, 2);
        return function() { fn.apply(context, args); };
    };
       
    lib.hasOwn = function(o, k) { return hasOwn.call(o, k); };
           
   
    /** Collections------------------------------------------------------ **/  
    lib.each = function(o, fn, context) {
        var i, j, len;
        if (!o) { return; }    
   
        if (toStr.call(o) == isObject) {
            for (j in o) {
                if (!this.hasOwn(o, j)) { continue; }
                fn.call(context, o[j], j, o);  
            }
        } else {
            if (!!arrForEach) { return arrForEach.call(o,fn, context); }
            i = -1; len = o.length;
            for (;++i<len;) { fn.call(context, o[i], i, o); }
        }
    };
   
    lib.some = function(o, fn, context) {
        var res = false;  
        if (!o) { return; }
        if (typeof o.length === 'number') { return o.some(fn, context); }
        this.each(o, function(el, i) {
            if (fn.call(context, el, i, o)) { res = true; return res; }    
        });
        return res;
    };                                                                                    
   
    lib.every = function(o, fn, context) {
        var res;
        if (!o) { return; }    
        if (this.type(o) === "object" || !arrEvery) {
            res = true;
            this.each(o, function(el, i) {
                if (!fn.call(context, el, i, o)) { res = false; return res; }    
            });
            return res;  
        } else { return arrEvery.apply(o, arrSlice.call(arguments, 1)); }
    };
   
    lib.reduce = function(o, fn, initVal, context) {  
        var val = (undefined !== initVal);  
        if (!o) { return; }    
        if (!!context) { fn = this.bind(fn, context); }
        if (this.type(o) === "object" || !arrReduce) {
            this.each(o, function(el, i) {  
                if (!val) {
                    initVal = el;
                    val = true;
                } else { initVal = fn.call(null, initVal, o[i], i, o); }
            });
            return initVal;
        } else { return arrReduce.apply(o, arrSlice.call(arguments, 1)); }        
    };
   
    lib.map = function(o, fn, context) {
        var output;    
        if (!o) { return; }    
        if (this.type(o) === "object" || !arrMap) {
            output = [];
            this.each(o, function(el, i) {
                output.push(fn.call(context, el, i, o));
            });
            return output;
        } else { return arrMap.apply(o, arrSlice.call(arguments, 1)); }
    };
   
    lib.filter = function(o, fn, context) {  
        var output;
        if (!o) { return; }
        if (this.type(o) === "object" || !arrFilter) {
            output = [];
            this.each(o, function(el, i) {
                if (fn.call(context, el, i, o)) { output.push(el); }
            });
            return output;
        } else { return arrFilter.apply(o, arrSlice.call(arguments, 1)); }
    };
   
    lib.shuffle = function(o) {  
        if (!o) { return; }    
        if (this.type(o) !== "array") { o = this.toArray(o); }  
        return o.sort(function() { return Math.random()-0.5; });
    };
   
    lib.toArray = function(o) {
        if (!o) { return; }    
        if (this.type(o) === "array") { return o; }
        if (this.type(o) === "object") { return this.map(o, function(el) { return el; }); }
        return arrSlice.call(o);
    };
   
    lib.size = function(o) {
        if (!o) { return; }    
        if (this.type(o) === "object") { o = this.toArray(o); }  
        return o.length;
    };                                        
     
    lib.merge = function() {
        var hasArray = this.some(arguments, function(el) { return this.type(el) === "array"; }, this),
            isObject = this.every(arguments, function(el) { return this.type(el) === "object"; }, this),
            output = "";
        if (hasArray) {
            output = [];
            this.each(arguments, function(el) { output = output.concat(el); });
        } else if (isObject) {
            output = {};
            this.each(arguments, function(el) {
                this.each(el, function(el_, j) { output[j] = el_;});
            }, this);
        } else { this.each(arguments, function(el) { output += el; }); }
        return output;
    };  
   
    lib.isEmpty = function(o) { return this.size(o) === 0; };  
   
    lib.has = function(o, el) {
        if (this.type(o) === "object") { return this.some(o, function(el_, i) { return el == i; }); }  
        if (this.type(o) === "array" || this.type(o) === "domelement") { return this.indexOf(o, el) !== -1; }
        if (this.type(o) === "string") { return strIndexOf.call(o, el) !== -1; }
        return false;
    };
     
   
    /** Array-likes------------------------------------------------------ **/  
    lib.indexOf = function(o, el, from) {    
        var index = -1, exit;  
        if (this.type(o) !== "array" && this.type(o) !== "domelement") { return index; }
        from = (!!from && !isNaN(+from)) ? from : 0;  
       
        if (!!arrIndexOf) { return arrIndexOf.apply(o, arrSlice.call(arguments, 1)); }
        exit = false;
        this.each(o, function(el_, i) {  
            if (el === el_ && i >= from && !exit) {
                index = i;  
                exit = true;
            }
        });
        return index;
    };
   
    lib.lastIndexOf = function(o, el, from) {
        var index = -1;
        if (this.type(o) !== "array" && this.type(o) !== "domelement") { return index; }  
        from = (!!from && !isNaN(+from)) ? from : 0;
       
        if (!!arrLastIndexOf) { return arrLastIndexOf.apply(o, arrSlice.call(arguments, 1)); }
        this.each(o, function(el_, i) {  
            if (el === el_ && i <= from) { index = i; }
        });
        return index;
    };
     
   
    /** Object-literals------------------------------------------------------ **/
    lib.keys = function(o) {
        if (this.type(o) !== "object") { return []; }        
        if (!!objKeys) { return objKeys(o);  }
        return this.map(o, function(el, i) { return i; });
    };
     
    }(i = window.i || {}));
};
</script>

Preparation code output

Test runner

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

Java applet disabled.

Testing in unknown unknown
Test Ops/sec
some
_.some([0,1,2], function(el) { 
 return el === 0
})
pending…
i
i.some([0,1,2], function(el) { 
 return el === 0
})
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