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 相关文章推荐
网站页面自动跳转实现方法PHP、JSP(下)
Aug 01 Javascript
js预载入和JavaScript Image()对象使用介绍
Aug 28 Javascript
浅谈Unicode与JavaScript的发展史
Jan 19 Javascript
JavaScript简单表格编辑功能实现方法
Apr 16 Javascript
javascript中sort() 方法使用详解
Aug 30 Javascript
js变量提升深入理解
Sep 16 Javascript
jQuery基于ajax操作json数据简单示例
Jan 05 Javascript
轻松理解JavaScript之AJAX
Mar 15 Javascript
JavaScript基于扩展String实现替换字符串中index处字符的方法
Jun 13 Javascript
JS加密插件CryptoJS实现的Base64加密示例
Aug 16 Javascript
Layui实现数据表格默认全部显示(不要分页)
Oct 26 Javascript
详解实现vue的数据响应式原理
Jan 20 Vue.js
容易造成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
日本十大科幻动漫 宇宙骑士垫底,第一已成经典
2020/03/04 日漫
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
laravel高级的Join语法详解以及使用Join多个条件
2019/10/16 PHP
基于jQuery的图片剪切插件
2011/08/03 Javascript
解决json日期格式问题的3种方法
2014/02/02 Javascript
jquery实现textarea输入框限制字数的方法
2015/01/15 Javascript
基于replaceChild制作简单的吞噬特效
2015/09/21 Javascript
JavaScript实现点击按钮切换网页背景色的方法
2015/10/17 Javascript
javascript判断图片是否加载完成的方法推荐
2016/05/13 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
js仿百度音乐全选操作
2017/01/13 Javascript
jquery实现图片跟随鼠标的实例
2017/10/17 jQuery
JS实现提交表单前的数字及邮箱校检功能
2017/11/13 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
jQuery使用jsonp实现百度搜索的示例代码
2020/07/08 jQuery
[02:37]2018DOTA2亚洲邀请赛赛前采访-EG篇
2018/04/03 DOTA
python计算N天之后日期的方法
2015/03/31 Python
轻松实现python搭建微信公众平台
2016/02/16 Python
Python 基础教程之包和类的用法
2017/02/23 Python
Python3中的json模块使用详解
2018/05/05 Python
python numpy 一维数组转变为多维数组的实例
2018/07/02 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
Python中按值来获取指定的键
2019/03/04 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
pandas计算最大连续间隔的方法
2019/07/04 Python
python实现多线程端口扫描
2019/08/31 Python
Python帮你微信头像任意添加装饰别再@微信官方了
2019/09/25 Python
python 计算积分图和haar特征的实例代码
2019/11/20 Python
Python第三方包之DingDingBot钉钉机器人
2020/04/09 Python
领先的英国注册在线药房 :Simply Meds Online
2019/03/28 全球购物
一套PHP的笔试题
2013/05/31 面试题
static全局变量与普通的全局变量有什么区别
2014/05/27 面试题
自我鉴定 电子商务专业
2014/01/30 职场文书
农业开发项目建议书
2014/05/16 职场文书
鼓舞士气的口号
2014/06/16 职场文书