今天看JS性能优化中提及不要滥用eval方法,会运行时再次调用解释引擎对内容进行运行。因此想测试下,究竟eval的效率如何
测试中通过直接调用方法传递参数和通过eval方法调用并传递参数,比较不使用eval时和使用eval方式时的差异。
测试代码如下:
- <html>
- <body>
- <input type=button value="直接调用" οnclick="execFun(fun1)">
- <input type=button value="eval" οnclick="execFun(fun2)">
- </body>
- <mce:script type="text/javascript"><!--
- // 测试执行次数
- var times = 500000;
- /**
- * 测试方法
- */
- function testFun(parm) {
- }
- /**
- * 执行方法
- */
- function execFun(fun) {
- var t1 = new Date();
- for (var i = 0; i < times; i++) {
- fun();
- }
- var t2 = new Date();
- alert(t2.getTime() - t1.getTime());
- }
- /**
- * 测试方法1,和测试方法2长度相同
- */
- function fun1() {
- testFun("aaaaaaaaaaaaaaaaaa");
- }
- /**
- * 测试方法2
- */
- function fun2() {
- eval('testFun("aaaaaaaaaa")');
- }
- // --></mce:script>
- </html>
测试结果:
IE8:
直接调用:440ms eval:5000ms
FireFox3.6:
直接调用:2ms eval:738ms
Chrome5:
直接调用:6ms eval:234ms
仅对IE8、FireFox3.6、Chrome5三种主流浏览器测试,如果需要了解其他浏览器情况,请自行测试。
结论:
本文不关心不同浏览器执行效率,仅对比同种浏览器eval方法执行效率,从IE8中的测试结果可以看出,二者相差10倍,如果小范围应用尚可接受;从FireFox3.6中的测试结果可以看出,二者相差几百倍,通常情况下不要用eval方法,Chrome5测试结果处于IE和FireFox之间,二者相差数十倍;
eval方法效率还是比较低的,能不用则尽量不用。