对于函数的执行性能(这里主要考虑执行时间,所耗内存暂不考虑),这里写了一个简单的类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. Spring Boot - 依赖注入

    @Autowired 查找被注解的变量类型,找到所有此类型的构建或此类型子类的构建 如果一个也没有找到,看required参数,false则用null,true则失败(默认,即spring会启动失败) ...

  2. “全栈2019”Java第八十四章:接口中嵌套接口详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. bzoj2705Longge的问题

    题目链接 题意很简单 $$ans=\sum_{i=1}^{n}gcd(i,n)$$ 然后推一下式子,求一下欧拉函数就好了 细节是由于$BZOJ$的评测计时策略, 不能线性筛啊$……$ 必须每个数单独筛 ...

  4. [Objective-C语言教程]常量(7)

    常量指的是程序在执行期间不会改变的固定值.这些固定值也称为文字.常量可以是任何基本数据类型,如整数常量,浮点常量,字符常量或字符串文字.还有枚举常量.常量被视为常规变量,只不过它们的值在定义后无法修改 ...

  5. 生产环境elasticsearch

    生产环境建议用curl来调用elasticsearch的restful接口来创建索引,每个索引的index脚本,mapping的脚本都提前写好提到git上打包,部署的时候直接通过curl执行 开发环境 ...

  6. CentOS 中卸载 RPM 包文件

    CentOS 中卸载 RPM 包文件 一.原由 因为之前卸载 openvas 这个工具,使用了 find / -name "openvas"-exec rm -rf {} \ ; ...

  7. ArchLinux 下安装 SecureCRT

    相关说明: 上篇发了个Linux(Ubuntu) 下 SecureCRT 7 30天循环破解在启动的时候会多输入一次确认窗口, 后来maz-1网友留言说可以用Windows破解后程序替换Linux下的 ...

  8. nginx下重写隐藏index.php文件

    location / { root /项目目录/; index index.php; if (-f $request_filename/index.php){ rewrite (.*) $1/inde ...

  9. mask layer的遮罩层

    1. layer层 mask 遮罩效果 //渐变层 CAGradientLayer *gradientLayer = [CAGradientLayer layer]; gradientLayer.fr ...

  10. c++primer 学习笔记

    1.1 编写简单的c++程序 函数4元素:函数类型.函数名.形参表.函数体 调用GNU(UNIX) g++ prog1.cc -o prog1 //生成可执行文件prog1,UNIX下默认a.out ...