Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

eval对代码效率的影响

  本文中的测试过程有错误,请参见“不同方法执行代码的效率
  昨天听到有人说使用eval会影响到效率,于是做了下测试,发现这玩意儿在各引擎上有着巨大的差异,而且还和严格模式有关系。其实我一直都不把eval当回事,虽然很多文章都说坚决不用它。不过我觉得,这是脚本语言的精髓所在,要没有它还用脚本语言干什么?
  首先eval确实可能对效率造成影响,因为ECMA262只做了功能上的定义,并没有在实现方式上的定义。所以它在各个引擎下的实现对程序效率的影响就不同。比如FireFox中就几乎没有效率上的影响,而IE下就差别巨大。下面咱用代码来说话 //eval中执行
eval(
  "var i,t=new Date,o=[];"+
  "for(i=0;i<1E7;i++)o[i]=i;"+
  "console.log(new Date-t);"
);
//正常执行
(function(){
  var i,t=new Date,o=[];
  for(i=0;i<1E7;i++)o[i]=i;
  console.log(new Date-t);
})();

  在FireFox中eval执行和正常执行的效率是一样的,测试结果中的这个数值只是误差而已,多测试几次取平均值就会发现他们没区别。在Chrome中,eval的效率比正常执行低了40%左右。其实40%并不高,对效率的比对是用对数来计算的,40%只是个零头而已。 在IE中两个结果就是天壤之别了,效率可以差上十多倍。这只是普通的测试,下面我们使用严格模式再测试一次。 //eval中执行
eval(
  "'use strict';"+
  "var i,t=new Date,o=[];"+
  "for(i=0;i<1E7;i++)o[i]=i;"+
  "console.log(new Date-t);"
);
//正常执行
(function(){
  "use strict";
  var i,t=new Date,o=[];
  for(i=0;i<1E7;i++)o[i]=i;
  console.log(new Date-t);
})();

  在使用严格模式后结果就不同了。在FireFox中,eval的效率变得稍微低于正常执行。这个效率反而降低是很奇葩的,我不知道FireFox到底做了什么奇怪的事情。在Chrome中,效率比原来高了一些,虽然还是不如正常执行的情况。而在IE中,使用严格模式带来的效率优化是很可观的,把原来十几倍的差距缩小到了两倍。这里使用了IE10,因为9不支持严格模式,不过他们的引擎是相同的,你可以两次正常模式下运行的结果看出。
  这东西我也是今天做了这个测试后才知道的,之前使用eval比较随便,现在知道IE下差了十多倍的效率就不能再那么随便了。其实eval也没什么缺点,只是IE那奇葩的玩意儿的行为诡异了一些而已。不要把这个责任退给eval,抛弃eval是不可能的,除非直接放弃脚本语言。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^