北漂IT民工 的博客

eval is evil, 驳老赵性能无损说

http://blog.zhaojie.me/2012/08/js-code-from-eval-benchmark.html

原文把一个固定值传给了eval,

那么经过js的解释器一分析后,由于字符串是固定的,所以优化过的js引擎就会直接解析成函数返回。

因为这里eval不eval根本没有区别。将这个来测试eval性能,只能说是一种行为艺术。

那么如何证明eval在实际上对于性的损失影响很大呢?

方法很简单,两行代码,一个浏览器Chrome:

在Chrome下Ctrl+i打开调试界面,点入console:

复制下面的代码执行:

1
2
3
4
5
6
7
var sum = 0, a = 0, b = 0, i = 0, c = 0; a = new Date(); for(; i < 1000 ; i++) { sum = eval( 'sum + i'); }; b = new Date(); c = b - a; </em></p>

118//结果

var sum = 0, a = 0, b = 0, i = 0, c = 0; a = new Date(); for(; i < 1000 ; i++) { sum = sum + i; }; b = new Date(); c = b - a;</em>

3//结果

 

在这里相关了118 / 3 ~ 40倍……

还有几次的结果是

119 / 2 ~ 60倍

如果这样是无性能损失的话,那60个人就等于是一个人。

 

 

受@老赵的错误引导,有下面的结论:

october 2012-08-20 16:26:12

eval并没有什么性能损失吧. eval只是可以让程序员人为控制编译时机, 但编译消耗的时间还是一样的. 比如某一js文件有10000行代码, 假设需要编译x秒 把后5000行代码用eval包起来后,
js文件:
1 … 此处5000行js代码 …
2 eval(“…此处5000行js代码…”)
那么过程就变成了: 编译前5000行 -> 运行前5000行 -> 运行到eval() -> 编译后5000行
看的出来,只是编译人为置后了, 应该没有性能损失….拙见….