很小的一个函数执行时间调试器Timer
对于函数的执行性能(这里主要考虑执行时间,所耗内存暂不考虑),这里写了一个简单的类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的更多相关文章
- PHP很有用的一个函数ignore_user_abort ()
PHP很有用的一个函数ignore_user_abort () 2013-01-16 14:21:31| 分类: PHP | 标签:php 函数 |举报|字号 订阅 ignore_us ...
- xcode 调试器 LLDB
本文完全转载,转载地址:点击这里 你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThisThing); 或者跳过一个函 ...
- 《python灰帽子》学习笔记:调试器设置
一.构造 C 数据类型 C Type | Python Type | ctypes Type ____________________________________________________ ...
- 与调试器共舞 - LLDB 的华尔兹
你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? 1 NSLog(@"%@", whatIsInsideThisThing); 或者跳过一个函数调用来简化程序的行为? 1 ...
- 用python开发调试器——起始篇
首先,你得准备一套python开发环境,正常情况下,一般是在windows下开发的,因为win系统应用广泛,再则就是要有个IDE,这里我选择我熟悉的Eclipse.环境搭建,网上都有,比如:http: ...
- Qt Creator在Windows上的调试器安装与配置
如果安装Qt时使用的是Visual Studio的预编译版,那么很有可能就会缺少调试器(Debugger),而使用MSVC的Qt对应的原生调试器是CDB(对应MinGW的Qt使用GDB调试器).本文介 ...
- Qt在Windows上的调试器CDB安装与配置
如果安装Qt时使用的是Visual Studio的预编译版,那么很有可能就会缺少调试器(Debugger),而使用MSVC的Qt对应的原生调试器是CDB(对应MinGW的Qt使用GDB调试器).本文介 ...
- Qt在Windows上的调试器安装与配置
如果安装Qt时使用的是Visual Studio的预编译版,那么很有可能就会缺少调试器(Debugger),而使用MSVC的Qt对应的原生调试器是CDB(对应MinGW的Qt使用GDB调试器).本文介 ...
- 【Qt开发】Qt Creator在Windows上的调试器安装与配置
Qt Creator在Windows上的调试器安装与配置 如果安装Qt时使用的是Visual Studio的预编译版,那么很有可能就会缺少调试器(Debugger),而使用MSVC的Qt对应的原生调试 ...
随机推荐
- 结构(struct)
结构是程序员定义的数据类型,非常类似于类.都包含数据成员和函数成员. 区别:1.类是引用类型,而结构是值类型 2.结构是隐式密封的,也就是结构不能被派生. 结构类型和所有值类型一样,含有自己的数据.需 ...
- Entity Framework 6 暂停重试执行策略
EF6引入一个弹性连接的功能,也就是允许重新尝试执行失败的数据库操作.某些复杂的场景中,可能需要启用或停用重试执行的策略,但是EF框架暂时尚未提供直接的设置开关,将来可能会加入这种配置.幸运的是,很容 ...
- Conditional Expressions
Conditional Expressions建立一些逻辑关系 The conditional expression classes from django.db import models clas ...
- Magicodes.NET框架之路[转]
插件式框架 响应式布局以及前后端对移动设备的支持 便捷的业务代码生成,比如CRUD生成,并且表单支持根据不同数据类型或特性生成相应的展示组件. 从框架到插件包括代码生成模板均走开源路线,便于理解和定制 ...
- 带你玩转Visual Studio——带你高效开发
VassistX的简单介绍与下载安装 简单介绍 VassistX的全称是Visual Assist X,是whole tomato开发的一个非常好用的插件,可用于VC6.0及Visual Studio ...
- dataframe去重 drop_duplicates
data.drop_duplicates() #默认:data中一行元素全部相同时才去除 data.drop_duplicates(['a','b'])#data根据’a','b'组合列删除重复项,默 ...
- django中models联合唯一unique_together
例: 文章点赞 class ArticleUpDown(models.Model): """ 点赞表 """ nid = models.Au ...
- OCP认证052考试最新考试题库和答案整理-33
33.Where Is backup metadata stored for use by Recovery Manager (RMAN)? A) In the control file B) In ...
- ArchLinux 下 virtualbox 报错 libQtCore.so.4: cannot open shared object file
VirtualBox: supR3HardenedMainGetTrustedMain: dlopen("/usr/lib/virtualbox/VirtualBox.so",) ...
- js计算器案例
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>j ...