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

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

  1. /**
  2. * 执行时间调试器
  3. *
  4. * Timer类
  5. */
  6. (function(win) {
  7.  
  8. var Timer = function() {
  9. return this;
  10. };
  11.  
  12. Timer.log = function(content) {
  13. if (typeof console == "undefined") { // IE6/7
  14. if(win.navigator.userAgent.indexOf("MSIE")>0) {
  15. alert(content);
  16. }
  17. } else {
  18. console.log(content);
  19. }
  20. };
  21.  
  22. Timer.prototype = {
  23.  
  24. // 开始执行时间
  25. start: function() {
  26. this.startTime = +new Date();
  27. return this;
  28. },
  29.  
  30. // 结束执行时间,并记录与开始执行时间的差值
  31. stop: function(canLog) {
  32. if (canLog && canLog === false) {
  33. return this;
  34. }
  35. Timer.log(+new Date - this.startTime);
  36. return this;
  37. },
  38.  
  39. // 指定次数内,函数的执行时间
  40. forFn: function(fn, times) {
  41. var start, end;
  42. start = +new Date;
  43. if (times && typeof times === 'number') {
  44. for (var i = 0; i < times; i++) {
  45. fn();
  46. }
  47. } else {
  48. fn();
  49. }
  50. end = +new Date;
  51. Timer.log(end - start);
  52. return this;
  53. }
  54.  
  55. };
  56.  
  57. win.Timer = Timer;
  58.  
  59. })(window);

  举两个调式的例子。

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

  1. (function(doc, $) {
  2.  
  3. // 创建元素 - 10000个li
  4. function createElement() {
  5. var ulElement = doc.createElement('ul'),
  6. liList = [],
  7. i;
  8. for (i = 0; i < 10000; i++) {
  9. liList.push('<li>' + i + '</li>');
  10. }
  11. ulElement.innerHTML = liList.join('');
  12. doc.body.appendChild(ulElement);
  13. }
  14.  
  15. // 非委托事件绑定
  16. function bind() {
  17. $('ul li').bind('click', function() {
  18. alert('bind')
  19. });
  20. }
  21.  
  22. // 委托事件绑定
  23. function delegate() {
  24. $('ul').delegate('li', 'click', function() {
  25. alert('delegate');
  26. });
  27. }
  28.  
  29. createElement();
  30.  
  31. var timer = new Timer();
  32. timer.forFn(bind);
  33. timer.forFn(delegate);
  34.  
  35. })(document, jQuery);

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

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

  1. // 对比ID选择器和类选择器
  2. new Timer().forFn(function() {
  3. $('#test');
  4. }, 10000); // 13ms
  5.  
  6. new Timer().forFn(function() {
  7. $('.test')
  8. }, 10000); // 65ms

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

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

  1. new Timer().forFn(function() {
  2. $('.test')
  3. }, 10000);
  4.  
  5. new Timer().forFn(function() {
  6. $('div.test')
  7. }, 10000);

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

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

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

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

  

  总之,这个很小的时间调试器有待日益完善,功能扩展点还需要各位博友多提供一些,大家一起思考,以更好的去调试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. MFC学习(三):项目学习

    1. 概述 MFC程序由CWinApp.MainFrm(含Menu,可用CSplitterWndEx分割).众多Dialog等组成. MFC既可以使用纯Dialog的形式,也可以使用Document+ ...

  2. .net core2.1 CookieHelper

    /// <summary> /// ** 描述:Cookie for .net core2.1 /// ** 创始时间:2018-11-19 /// ** 修改时间:- /// ** 作者 ...

  3. Strings in the Pocket(马拉车+字符串判断)

    题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 BaoBao has just found two strings ...

  4. 40. 组合总和 II leetcode JAVA

    题目: 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使 ...

  5. 30.Rotate Image(矩阵旋转)

    Level:   Medium 题目描述: You are given an n x n 2D matrix representing an image. Rotate the image by 90 ...

  6. “全栈2019”Java第三十五章:面向对象

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

  7. PHP函数补完:call_user_func()

    call_user_func是PHP的内置函数,该函数允许用户调用直接写的函数并传入一定的参数,下面总结下这个函数的使用方法. 1,call_user_func函数类似于一种特别的调用函数的方法,使用 ...

  8. 关于:maven项目中pom.xml文件添加依赖无法自动搜索的问题

    用的是eclipse 1.Window------>Show View------->Maven Repositories(这个选项一般不直接显示,而在others里面) 2.操作完毕后会 ...

  9. sql 列集合

    STUFF((SELECT ','+CAST( TYZ_Bh  as varchar(10)) FROM #1 where 片区划分='江东' for xml path('')),1,1,'')

  10. JAVA static深入了解

    static关键字: 1)static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享:2)只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的 ...