@老赵 的一个微博“ 由eval生成的代码效率真的很差吗? 内含人身攻击,不喜勿入。”
引发了最近对eval火爆的讨论,教主 @Franky 和 灰大 @otakustay 也给了精彩的数据分析。
刚好之前也做过类似的测试,我也跟风凑个热闹,提供两组数据供大家参考。
更新1: 感谢灰大 @otakustay 的指导,为排除eval('')调用本身对结果的影响,增加一组新数据A3, B3。并对旧的全部数据重测。
更新2: 感谢莫大 @貘吃馍香 的强力拍砖,增加了1). A4, B4;A5,B5的eval覆盖后的测试数据; 2). A6,B6 eval别名;3). A7,B7 eval.call。
测试环境:
a. 机器:Intel(R) Corei7-2720 2.2Ghz (4核心8线程)、内存8Gb
b. OS:Windows 7 Enterprise SP1 64-bit
c. 浏览器:
b.1 Google Chrome 21.0.1180.79 m
b.2 Firefox 14.0.1
b.3 IE9.0.8112.16421
d. 测试方法
d.1 每个用例测试5次,耗时取最小值。
d.2 测试过程中没有开启Firebug或Chrome Console,开启这些工具会使时间倍增,很难在有效时间内得到该用例结果
用例A1:
我们在内联函数中调用空的eval("")
复制代码 代码如下:
!function() {
var a = 1,
b = 2,
c = true;
function func() {
var d = 2;
e = !c;
eval("");
}
for (var i = 0; i < 2999999; i++) {
func(i, i + 1, i + 2);
}
}();
用例A2:
注释掉内联函数中的eval("")
复制代码 代码如下:
!function() {
var a = 1,
b = 2,
c = true;
function func() {
var d = 2;
e = !c;
//eval("");
}
for (var i = 0; i < 2999999; i++) {
func(i, i + 1, i + 2);
}
}();
用例A3:
为排除eval("")调用本身产生的影响,我们在外层函数中调用eval("")
复制代码 代码如下:
!function() {
var a = 1,
b = 2,
c = true;
function func() {
var d = 2;
e = !c;
}
for (var i = 0; i < 2999999; i++) {
eval("");
func(i, i + 1, i + 2);
}
}();
用例A4:
将eval()函数覆盖成普通的空函数
复制代码 代码如下:
function eval(){}
!function() {
var a = 1,
b = 2,
c = true;
function func() {
var d = 2;
e = !c;
eval("");
}
for (var i = 0; i < 2999999; i++) {
func(i, i + 1, i + 2);
}
}();
用例A5:
同样是函数调用,不是eval而且另一个空函数f
复制代码 代码如下:
function f(){}
!function() {
var a = 1,
b = 2,
c = true;
function func() {
var d = 2;
e = !c;
f("");
}
for (var i = 0; i < 2999999; i++) {
func(i, i + 1, i + 2);
}
}();
用例A6:
将eval赋给另一个变量f,然后调用f
复制代码 代码如下:
var f = eval;
!function() {
var a = 1,
b = 2,
c = true;
function func() {
var d = 2;
e = !c;
f("");
}
for (var i = 0; i < 2999999; i++) {
func(i, i + 1, i + 2);
}
}();
用例A7:
使用eval.call的方式去调用
复制代码 代码如下:
!function() {
var a = 1,
b = 2,
c = true;
function func() {
var d = 2;
e = !c;
eval.call(null, '');
}
for (var i = 0; i < 2999999; i++) {
func(i, i + 1, i + 2);
}
}();
A组测试结果:
A1
A2
A3
A4
A5
A6
A7
A1 : A2
A1 : A3
A1 : A4
A4 : A5
Chrome
1612ms
8ms
1244ms
897ms
7ms
718ms
680ms
201.5
1.3
1.8
128.1
Firefox
2468ms
69ms
732ms
2928ms
134ms
5033ms
4984ms
35.8
3.4
0.8
21.9
IE
1207ms
23ms
233ms
1147ms
37ms
148ms
224ms
52.5
5.2
1.0
31.0
复制代码 代码如下: