对于函数的执行性能(这里主要考虑执行时间,所耗内存暂不考虑),这里写了一个简单的类Timer,用于量化函数执行所耗时间。

  整体思路很简单,就是new Date()的时间差值。我仅仅了做了一层简单的封装——

/**
* 执行时间调试器
*
* Timer类
*/
(function(win) { var Timer = function() {
return this;
}; Timer.log = function(content) {
if (typeof console == "undefined") { // IE6/7
if(win.navigator.userAgent.indexOf("MSIE")>0) {
alert(content);
}
} else {
console.log(content);
}
}; Timer.prototype = { // 开始执行时间
start: function() {
this.startTime = +new Date();
return this;
}, // 结束执行时间,并记录与开始执行时间的差值
stop: function(canLog) {
if (canLog && canLog === false) {
return this;
}
Timer.log(+new Date - this.startTime);
return this;
}, // 指定次数内,函数的执行时间
forFn: function(fn, times) {
var start, end;
start = +new Date;
if (times && typeof times === 'number') {
for (var i = 0; i < times; i++) {
fn();
}
} else {
fn();
}
end = +new Date;
Timer.log(end - start);
return this;
} }; win.Timer = Timer; })(window);

  举两个调式的例子。

  首先,测试一下是否使用事件委托绑定事件——

(function(doc, $) {

    // 创建元素 - 10000个li
function createElement() {
var ulElement = doc.createElement('ul'),
liList = [],
i;
for (i = 0; i < 10000; i++) {
liList.push('<li>' + i + '</li>');
}
ulElement.innerHTML = liList.join('');
doc.body.appendChild(ulElement);
} // 非委托事件绑定
function bind() {
$('ul li').bind('click', function() {
alert('bind')
});
} // 委托事件绑定
function delegate() {
$('ul').delegate('li', 'click', function() {
alert('delegate');
});
} createElement(); var timer = new Timer();
timer.forFn(bind);
timer.forFn(delegate); })(document, jQuery);

  数据就不罗列了,能够看出来,使用事件委托的方式,明显效率更快。

  第二个子,列举一下jQuery选择器的效率性能测试——

// 对比ID选择器和类选择器
new Timer().forFn(function() {
$('#test');
}, 10000); // 13ms new Timer().forFn(function() {
$('.test')
}, 10000); // 65ms

  如果,这里的test类的元素有两个以上,这里的执行时间会有所递增,但浮动不大。

  再列举一下,在Classes前面是否使用Tags的执行时间——

new Timer().forFn(function() {
$('.test')
}, 10000); new Timer().forFn(function() {
$('div.test')
}, 10000);

  相对于chrome及firefox而言,后者的执行时间略短一些。而对于IE而言,前者的执行时间略短一些。

  对于这里的start与stop方法,主要是用于函数内部的一段代码执行时间的测试,简单写个模板——

function tester() {
// 逻辑1 ... var timer = new Timer().start();
// 逻辑2 ...
timer.stop(); // 便可得出逻辑2中代码的执行时间 // 逻辑3 ...
}

  可用于测试任何可能影响性能相关的代码。

  

  总之,这个很小的时间调试器有待日益完善,功能扩展点还需要各位博友多提供一些,大家一起思考,以更好的去调试js执行时间。

很小的一个函数执行时间调试器Timer的更多相关文章

  1. PHP很有用的一个函数ignore_user_abort ()

    PHP很有用的一个函数ignore_user_abort () 2013-01-16 14:21:31|  分类: PHP |  标签:php  函数  |举报|字号 订阅     ignore_us ...

  2. xcode 调试器 LLDB

    本文完全转载,转载地址:点击这里 你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThisThing); 或者跳过一个函 ...

  3. 《python灰帽子》学习笔记:调试器设置

    一.构造 C  数据类型 C Type | Python Type | ctypes Type ____________________________________________________ ...

  4. 与调试器共舞 - LLDB 的华尔兹

    你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? 1 NSLog(@"%@", whatIsInsideThisThing); 或者跳过一个函数调用来简化程序的行为? 1 ...

  5. 用python开发调试器——起始篇

    首先,你得准备一套python开发环境,正常情况下,一般是在windows下开发的,因为win系统应用广泛,再则就是要有个IDE,这里我选择我熟悉的Eclipse.环境搭建,网上都有,比如:http: ...

  6. Qt Creator在Windows上的调试器安装与配置

    如果安装Qt时使用的是Visual Studio的预编译版,那么很有可能就会缺少调试器(Debugger),而使用MSVC的Qt对应的原生调试器是CDB(对应MinGW的Qt使用GDB调试器).本文介 ...

  7. Qt在Windows上的调试器CDB安装与配置

    如果安装Qt时使用的是Visual Studio的预编译版,那么很有可能就会缺少调试器(Debugger),而使用MSVC的Qt对应的原生调试器是CDB(对应MinGW的Qt使用GDB调试器).本文介 ...

  8. Qt在Windows上的调试器安装与配置

    如果安装Qt时使用的是Visual Studio的预编译版,那么很有可能就会缺少调试器(Debugger),而使用MSVC的Qt对应的原生调试器是CDB(对应MinGW的Qt使用GDB调试器).本文介 ...

  9. 【Qt开发】Qt Creator在Windows上的调试器安装与配置

    Qt Creator在Windows上的调试器安装与配置 如果安装Qt时使用的是Visual Studio的预编译版,那么很有可能就会缺少调试器(Debugger),而使用MSVC的Qt对应的原生调试 ...

随机推荐

  1. IIS7 配置ssl证书 多域名绑定443端口

    IIS7下多个子域名同时配置https协议,但IIS7默认支持单个443端口造成端口冲突: 解决方案:先把每个域名配置不同的端口 例:444,445,446等 然后在:C:\Windows\syste ...

  2. WordCount(JAVA实现)

    201631103228,201631101227 1.项目需求 对程序设计语言源文件统计字符数.单词数.行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件. wc. ...

  3. iOS 图片的存储以及读取和删除

    将图片存储到本地 NSArray *dirArray = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask ...

  4. Azure自定义角色实现RBAC

    简要说明: 当前Azure Portal上只能针对订阅或具体某一资源,实现访问控制,也就是对某一具体资源实现访问/使用/删除,但无法实现创建.例如:当前的需求为,新添加用户只具有对CDN服务的管理使用 ...

  5. Unity---解决重新调整游戏分辨率后,再运行游戏还是和之前分辨率一样的问题

    经历 上次在Unity做了个小游戏,发布的时候忘了取消默认全屏了. 于是在Unity重新发布了一下,可是出来后分辨率还是默认全屏. 当时百思不得其解 原因 主要是因为当用Unity发布一个新游戏的时候 ...

  6. tomcat Setting property 'source' to 'org.eclipse.jst.jee.server

    很不爽,好好的项目不知道突然怎么了... 启动tomcat出个错,,,,, setting property 'source' to 'org.eclipse.jst.jee.server:jeesi ...

  7. springboot(十一)-为什么要用springboot

    前言 学习了一段时间springboot,一般都可以在项目中使用springboot开发了.因为springboot的东西并不多,或者说,springboot根本就没有新东西. 好了,现在问一句,我们 ...

  8. 第二章C++实验

    2-28 (1)用if else 语句 #include<iostream> using namespace std; int main(){ char alphabet; while ( ...

  9. js toFixed 方法重写,兼容负数

    Number.prototype.toFixed = function (s) { var that = this, changenum, index; if (this < 0) { that ...

  10. float 浮动 文档流和文字流区别

    关于float属性的脱离文档流的问题 使用float浮动后,元素虽然会脱离文档流,但还处在文本流的位置当中,所以就不会出现重叠的效果吗? 下面我自己试了一下,给两个DIV分别设置了样式,而只给第一个D ...