JavaScript中匿名、命名函数的性能测试


Posted in Javascript onSeptember 04, 2014

我们经常通过匿名函数(Anonymous function)来写回调。

简单来讲匿名即没有名字的函数,一般都立即执行。但是它与命名函数(有名字的函数)的性能如何呢?

我们可以比较一下,我们随便找一台可以执行Shell命令的计算机来使用大量函数调用看一看二者执行消耗时间:

anonymous.js

var count = 100000000

  , sum   = 0

while (count--) (function() { sum++ })()

执行一下
$ time node anonymous.js

real    0m1.456s

user    0m0.015s

sys     0m0.031s

再来看看命名函数

named.js

var count = 100000000

  , sum   = 0
var cb = function() {

  sum++

}
while (count--) cb()

执行一下
$ time node named.js

real    0m0.575s

user    0m0.000s

sys     0m0.046s

命名函数会快很多,为什么会这样呢?其实不难解释,匿名函数每次都需要重新解释回调,但是命名函数只需要解释一次,因此性能会有提升,但是测试发现这种提升是非常非常微小的,完全不必将非常顺手的一个回调单独写成另外一个变量。

另外命名函数还有两种写法:

函数表达式

var func = function() {

  console.log('a')

}

函数声明
function func() {

  console.log('b')

}

其实这两个一起用的话可能会有问题,如
var func = function() {

  console.log('a')

}

function func() {

  console.log('b')

}

//输出为: a

因此目前多使用函数表达式的形式,但函数声明的性能如何呢?

named2.js

var count = 100000000

  , sum   = 0
function cb() {

  sum++

}
while (count--) cb()

执行一下,并比较二者
$ time node named.js

real    0m0.553s

user    0m0.000s

sys     0m0.015s
$ time node named2.js

real    0m0.529s

user    0m0.000s

sys     0m0.047s

似乎函数声明会稍微快一点点,不过快得也非常非常不明显,个人还是建议函数声明式写法。

PS: 此数据均在Windows7下使用git-base测试。

Javascript 相关文章推荐
理解Javascript_14_函数形式参数与arguments
Oct 20 Javascript
用Javascript评估用户输入密码的强度(Knockout版)
Nov 30 Javascript
jQuery Deferred和Promise创建响应式应用程序详细介绍
Mar 05 Javascript
jquery实现弹出窗口效果的实例代码
Nov 28 Javascript
a标签click和href执行顺序探讨
Jun 23 Javascript
JavaScript的removeChild()函数用法详解
Dec 27 Javascript
微信小程序 教程之wxapp 视图容器 view
Oct 19 Javascript
基于vue2实现上拉加载功能
Nov 28 Javascript
js删除数组中的元素delete和splice的区别详解
Feb 03 Javascript
vue实现提示保存后退出的方法
Mar 15 Javascript
vue响应式系统之observe、watcher、dep的源码解析
Apr 09 Javascript
JavaScript 防盗链的原理以及破解方法
Dec 29 Javascript
容易造成JavaScript内存泄露几个方面
Sep 04 #Javascript
require.js深入了解 require.js特性介绍
Sep 04 #Javascript
用console.table()调试javascript
Sep 04 #Javascript
js设置cookie过期当前时间减去一秒相当于立即过期
Sep 04 #Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
Sep 04 #Javascript
jQuery之Deferred对象详解
Sep 04 #Javascript
Javascript Objects详解
Sep 04 #Javascript
You might like
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
Cookie跨域问题解决方案代码示例
2020/11/24 PHP
一个简单的javascript类定义例子
2009/09/12 Javascript
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
2012/11/08 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
关于jQuery object and DOM element
2013/04/15 Javascript
简单的两种Extjs formpanel加载数据的方式
2013/11/09 Javascript
javascript trim函数在IE下不能用的解决方法
2014/09/12 Javascript
js实现汉字排序的方法
2015/07/23 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
基于jquery实现最简单的选项卡切换效果
2016/05/08 Javascript
JavaScript实现简单的日历效果
2016/09/25 Javascript
AngularJS实现的回到顶部指令功能实例
2017/05/17 Javascript
详解Webpack DLL用法以及功能
2017/07/11 Javascript
vue中路由参数传递可能会遇到的坑
2017/12/07 Javascript
vue多页面开发和打包正确处理方法
2018/04/20 Javascript
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
python实现多线程采集的2个代码例子
2014/07/07 Python
详解Python中for循环的使用方法
2015/05/14 Python
python利用标准库如何获取本地IP示例详解
2017/11/01 Python
python 中if else 语句的作用及示例代码
2018/03/05 Python
python实现简易内存监控
2018/06/21 Python
Python列表的切片实例讲解
2019/08/20 Python
基于html和CSS3制作酷炫的导航栏
2015/09/23 HTML / CSS
如何判断计算机可能已经中马
2013/03/22 面试题
大三自我鉴定范文
2013/10/05 职场文书
证婚人搞笑证婚词
2014/01/10 职场文书
大学生职业生涯规划书模板
2014/01/18 职场文书
仲裁协议书
2014/09/26 职场文书
展览会邀请函
2015/02/02 职场文书
学校会议通知范文
2015/04/15 职场文书
勇敢的心观后感
2015/06/09 职场文书
Django使用channels + websocket打造在线聊天室
2021/05/20 Python
Spring Boot 使用 Spring-Retry 进行重试框架
2022/04/24 Java/Android
面试官问我Mysql的存储引擎了解多少
2022/08/05 MySQL