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 编程引入命名空间的方法与代码
Aug 13 Javascript
向大师们学习Javascript(视频与PPT)
Dec 27 Javascript
javascript处理table表格的代码
Dec 06 Javascript
javascript闭包的理解
Apr 01 Javascript
jQuery实现二级下拉菜单效果
Jan 05 Javascript
BootStrap glyphicon图标无法显示的解决方法
Sep 06 Javascript
jQuery中delegate()方法的用法详解
Oct 13 Javascript
javascript动画之磁性吸附效果篇
Dec 09 Javascript
详解javascript获取url信息的常见方法
Dec 19 Javascript
用Axios Element实现全局的请求loading的方法
Mar 15 Javascript
解决element ui select下拉框不回显数据问题的解决
Feb 20 Javascript
Promise扫盲贴
Jun 24 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中比较简单的导入phpmyadmin生成的sql文件的方法
2011/06/28 PHP
解析isset与is_null的区别
2013/08/09 PHP
php统计文章排行示例
2014/03/04 PHP
php使用Jpgraph绘制饼状图的方法
2015/06/10 PHP
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
CodeIgniter记录错误日志的方法全面总结
2016/05/17 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
jQuery 解析xml文件
2009/08/09 Javascript
浅谈JavaScript的事件
2015/02/27 Javascript
jQuery 选择符详细介绍及整理
2016/12/02 Javascript
JavaScript中构造函数与原型链之间的关系详解
2019/02/25 Javascript
vue slot与传参实例代码讲解
2019/04/28 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
非常漂亮的js烟花效果
2020/03/10 Javascript
独特的python循环语句
2016/11/20 Python
Python 基础教程之包和类的用法
2017/02/23 Python
Python中装饰器高级用法详解
2017/12/25 Python
Python3.5.3下配置opencv3.2.0的操作方法
2018/04/02 Python
python3 中文乱码与默认编码格式设定方法
2018/10/31 Python
对python PLT中的image和skimage处理图片方法详解
2019/01/10 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
2019/07/11 Python
Python上下文管理器用法及实例解析
2019/11/11 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
如何用python写个模板引擎
2021/01/14 Python
python3中celery异步框架简单使用+守护进程方式启动
2021/01/20 Python
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
介绍一下木马病毒的种类
2015/07/26 面试题
工程造价自荐信
2013/10/09 职场文书
半年思想汇报
2013/12/30 职场文书
小学教师师德感言
2014/02/10 职场文书
幼儿园中班上学期评语
2014/04/18 职场文书
销售团队获奖感言
2014/08/14 职场文书
学校领导班子对照检查材料
2014/08/28 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
Win11 vmware不兼容怎么办?Win11与VMware虚拟机不兼容的解决方法
2023/01/09 数码科技