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 相关文章推荐
按Enter键触发事件的jquery方法实现代码
Feb 17 Javascript
js鼠标点击图片实现随机变换图片的方法
Feb 16 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
Jul 03 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
Apr 07 Javascript
Bootstrap学习笔记之环境配置(1)
Dec 07 Javascript
浅谈react前后端同构渲染
Sep 20 Javascript
Node.js利用断言模块assert进行单元测试的方法
Sep 28 Javascript
javaScript canvas实现(画笔大小 颜色 橡皮的实例)
Nov 28 Javascript
js 计算图片内点个数的示例代码
Apr 04 Javascript
解决layui动态加载复选框无法选中的问题
Sep 20 Javascript
vue实现简单图片上传
Jun 30 Javascript
浅谈vue 组件中的setInterval方法和window的不同
Jul 30 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抽奖小程序的实现代码
2013/06/18 PHP
PHP验证码函数代码(简单实用)
2013/09/29 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
2016/03/17 PHP
Yii核心验证器api详解
2016/11/23 PHP
简单谈谈PHP中的trait
2017/02/25 PHP
B/S开发中常用javaScript技术与代码
2007/03/09 Javascript
JQuery each()函数如何优化循环DOM结构的性能
2012/12/10 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
2015/04/22 Javascript
JS随机调用指定函数的方法
2015/07/01 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
js实现点击按钮弹出上传文件的窗口
2016/12/23 Javascript
非常优秀的JS图片轮播插件Swiper的用法
2017/01/03 Javascript
Node.js 回调函数实例详解
2017/07/06 Javascript
使用Vue-Router 2实现路由功能实例详解
2017/11/14 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
CKEditor4配置与开发详细中文说明文档
2018/10/08 Javascript
webpack4 配置 ssr 环境遇到“document is not defined”
2019/10/24 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
[01:20:38]完美世界DOTA2联赛 GXR vs IO 第一场 11.07
2020/11/09 DOTA
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
2014/11/18 Python
python 循环遍历字典元素的简单方法
2016/09/11 Python
Django后台获取前端post上传的文件方法
2018/05/28 Python
python logging重复记录日志问题的解决方法
2018/07/12 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
Python中一般处理中文的几种方法
2019/03/06 Python
python实现静态服务器
2019/09/05 Python
selenium 多窗口切换的实现(windows)
2020/01/18 Python
Python生成器实现简单"生产者消费者"模型代码实例
2020/03/27 Python
浅谈在JupyterNotebook下导入自己的模块的问题
2020/04/16 Python
CSS3 旋转立方体问题详解
2020/01/09 HTML / CSS
FOREO官方网站:LUNA露娜洁面仪
2016/11/28 全球购物
三方协议书范本
2014/04/22 职场文书
团队拓展活动总结
2014/08/27 职场文书
中学生检讨书1000字
2014/10/28 职场文书
CocosCreator如何实现划过的位置显示纹理
2021/04/14 Javascript