Created
January 1, 2012 06:53
-
-
Save hmert/1546548 to your computer and use it in GitHub Desktop.
jQuery Profiling Plugin
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* http://ejohn.org/blog/deep-profiling-jquery-apps/ | |
* use: call jQuery.displayProfile(); in firebug console | |
*/ | |
(function(){var log=[];var handle=jQuery.event.handle,ready=jQuery.ready;var internal=false;var eventStack=[];var curEvent=log[0]={event:"inline",methods:[],duration:0};if(!jQuery.readyList)jQuery.readyList=[];jQuery.readyList.unshift(function(){if(curEvent&&curEvent.event=="inline"&&curEvent.methods.length==0){log.shift()}if(curEvent)eventStack.push(curEvent);var e=curEvent=log[log.length]={event:"ready",target:formatElem(document),methods:[]};var start=(new Date).getTime();jQuery(document).bind("ready",function(){e.duration=(new Date).getTime()-start;curEvent=eventStack.pop()})});jQuery.event.handle=function(event){var pos=log.length;if(curEvent)eventStack.push(curEvent);var e=curEvent=log[pos]={event:event.type,target:formatElem(event.target),methods:[]};var start=(new Date).getTime();var ret=handle.apply(this,arguments);e.duration=(new Date).getTime()-start;curEvent=eventStack.pop();if(e.methods.length==0&&e.duration<=1){log.splice(pos,1)}return ret};for(var method in jQuery.fn)(function(method){if(method=="init")return;var old=jQuery.fn[method];jQuery.fn[method]=function(){if(!internal&&curEvent){internal=true;var m=curEvent.methods[curEvent.methods.length]={name:method,inLength:this.length,args:formatArgs(arguments)};var start=(new Date).getTime();var ret=old.apply(this,arguments);m.duration=(new Date).getTime()-start;if(curEvent.event=="inline")curEvent.duration+=m.duration;if(ret&&ret.jquery)m.outLength=ret.length;internal=false;return ret}else{return old.apply(this,arguments)}}})(method);var init=jQuery.fn.init;jQuery.fn.init=function(){var args=Array.prototype.slice.call(arguments);if(typeof args[1]=="undefined")args.pop();if(!internal&&curEvent){internal=true;var m=curEvent.methods[curEvent.methods.length]={name:"jQuery",args:formatArgs(args)};var start=(new Date).getTime();var ret=init.apply(this,arguments);m.duration=(new Date).getTime()-start;if(curEvent.event=="inline")curEvent.duration+=m.duration;m.outLength=ret.length;internal=false;return ret}else{return init.apply(this,args)}};jQuery.fn.init.prototype=init.prototype;jQuery.getProfile=function(){return log};jQuery.displayProfile=function(){var str="<div style='text-align:left;background:#FFF;color:#000;font-size:10px;width:400px;height:400px;overflow:auto;padding:8px;margin:10px;'>";for(var i=0;i<log.length;i++){var total=log[i].duration;str+="<big><b>Event: "+log[i].event+" ("+log[i].duration+"ms)</b></big><br/>"+"<table><tr><th>%</th><th>(ms)</th><th>Method</th><th>in</th><th>out</th></tr>";var methods=log[i].methods;for(var m=0;m<methods.length;m++){var method=methods[m];str+="<tr><td>"+((method.duration/total)*100).toFixed(1)+"%</td><td>"+method.duration+"</td><td>"+(method.name=="jQuery"?"":" .")+method.name+"("+method.args+")</td>"+"<td>"+(method.inLength||"")+"</td><td>"+(method.outLength||"")+"</td></tr>"}str+="</table>"}jQuery("body").append(str+"</div>")};function formatElem(elem){var str="";if(elem.tagName){str="<"+elem.tagName.toLowerCase();if(elem.id)str+="#"+elem.id;if(elem.className)str+="."+elem.className.replace(/ /g,".");str+=">"}else{str=elem.nodeName}return str}function formatArgs(args){var str=[];for(var i=0;i<args.length;i++){var item=args[i];if(item&&item.constructor==Array){str.push("Array("+item.length+")")}else if(item&&item.jquery){str.push("jQuery("+item.length+")")}else if(item&&item.nodeName){str.push(formatElem(item))}else if(item&&typeof item=="function"){str.push("function()")}else if(item&&typeof item=="object"){str.push("{...}")}else if(typeof item=="string"){str.push('"'+item.replace(/&/g,"&").replace(/</g,"<")+'"')}else{str.push(item+"")}}return str.join(", ")}})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment