本文通过Node.js环境下的实测数据,对比了JavaScript中匿名函数与命名函数的执行性能。测试结果显示,虽然命名函数因只需解释一次而略快于每次重新解释的匿名函数,但两者在百万次调用下的耗时差异极小。文章进一步探讨了函数表达式与函数声明的性能细微差别,并指出在实际开发中,代码可读性与维护性应优先于这种微小的性能提升。
匿名函数与命名函数性能对比
在JavaScript开发中,我们常使用匿名函数来编写回调逻辑。
匿名函数指的是没有名称的函数,通常用于立即执行场景。那么,它与拥有名称的命名函数在性能表现上究竟有何差异?
为了直观比较,我们可以选取一台支持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() {\n\n sum++\n\n}
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() {\n\n sum++\n\n}
while (count--) cb()执行上述代码,并对比二者结果。
代码如下:
$ time node named.js
real 0m0.553s
user 0m0.000s
sys 0m0.015s
$ time node named2.js\n\nreal 0m0.529s\n\nuser 0m0.000s\n\nsys 0m0.047s函数声明似乎略快于函数表达式,但差异微乎其微。个人建议仍优先使用函数声明式写法,以符合常规编码习惯。
注:以上测试数据均在Windows 7系统下使用git-base环境获取。