@老赵 的一个微博“ 由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    
复制代码 代码如下:
