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 相关文章推荐
番茄的表单验证类代码修改版
Jul 18 Javascript
javascript 写类方式之二
Jul 05 Javascript
javascript学习笔记(十三) js闭包介绍(转)
Jun 20 Javascript
千分位数字格式化(用逗号隔开 代码已做了修改 支持0-9位逗号隔开)的JS代码
Dec 05 Javascript
IE下双击checkbox反应延迟问题的解决方法
Mar 27 Javascript
javascript实现数组中的内容随机输出
Aug 11 Javascript
Bootstrap表单布局样式代码
May 31 Javascript
jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】
Aug 18 jQuery
vue.js给动态绑定的radio列表做批量编辑的方法
Feb 28 Javascript
十分钟教你上手ES2020新特性
Feb 12 Javascript
Vue 样式切换及三元判断样式关联操作
Aug 09 Javascript
一篇文章弄清楚Ajax请求的五个步骤
Mar 17 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
PHP IE中下载附件问题解决方法
2014/01/07 PHP
PHP使用redis实现统计缓存mysql压力的方法
2015/11/14 PHP
PHP中使用mpdf 导出PDF文件的实现方法
2018/10/22 PHP
laravel-admin 中列表筛选方法
2019/10/03 PHP
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
2015/05/06 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
2015/11/22 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
2016/01/28 Javascript
Jquery attr()方法 属性赋值和属性获取详解
2016/04/15 Javascript
jQuery实现鼠标滑过图片移动特效
2016/12/08 Javascript
利用Js+Css实现折纸动态导航效果实例源码
2017/01/25 Javascript
推荐三款日期选择插件(My97DatePicker、jquery.datepicker、Mobiscroll)
2017/04/21 jQuery
AngularJs返回前一页面时刷新一次前面页面的方法
2018/10/09 Javascript
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
vue遍历生成的输入框 绑定及修改值示例
2019/10/30 Javascript
微信小程序利用for循环解决内容变更问题
2020/03/05 Javascript
vue 使用async写数字动态加载效果案例
2020/07/18 Javascript
jQuery实现简单三级联动效果
2020/09/05 jQuery
微信小程序实现下拉加载更多商品
2020/12/29 Javascript
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python实现的登录与提交表单数据功能示例
2019/09/25 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
利用Python代码实现一键抠背景功能
2019/12/29 Python
Python2.6版本pip安装步骤解析
2020/08/17 Python
python破解同事的压缩包密码
2020/10/14 Python
Python模块常用四种安装方式
2020/10/20 Python
Python Selenium库的基本使用教程
2021/01/04 Python
python线程优先级队列知识点总结
2021/02/28 Python
营销总经理的岗位职责
2013/12/15 职场文书
大班上学期个人总结
2015/02/13 职场文书
军训心得体会范文(2016最新篇)
2016/01/11 职场文书
Nginx源码编译安装过程记录
2021/11/17 Servers
前端JS获取URL参数的4种方法总结
2022/04/05 Javascript