`
jljlpch
  • 浏览: 319766 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

eval与function的性能比较

阅读更多

日前,看到一位朋友在eval json串的,采用了

 

var a=new Function("return "+json);

a();

 

的方式 。

 

想着人家为什么不用eval 于是就做了一个它们之间的 性能测试

<head>				
		<title>代理测试</title>	
        <script type="text/javascript">	
		//var aa="{aa:'xx'}";
       var aa="{name:'cola',item:[{age:11},{age:22},{age:23},{age:23}]}";
        var now=new Date().getTime();
        for(var i=0;i<1000;i++){
           eval("("+aa+")"); 
            }
		var now1=new Date().getTime();
         alert(now1-now);
            
        var now2=new Date().getTime();
        for(var i=0;i<1000;i++){
            var fn=new Function("return"+aa);
            fn();           
            }
		var now3=new Date().getTime();
         alert(now3-now2);
       </script>
	</head>

 

结果发现在IE中eval是110ms,而fuction是172ms

在FF2中,eval是由1906ms,而fuctnion 187ms

可以看出 FF还是慢于IE6.但是eval在FF是出奇地慢。

 

可不可以改进一下eval呢?

 

var morik={};

morik.eval=function(s){

if(navigator.userAgent.toLowerCase().indexOf("msie") > -1)

 return eval(s);

else{

var aa=new Function( "return"+s);

return aa.apply(this);

 

}

 

};

 

本想采用

var _e=window.eval;

var eval=fucntion(s){...},

但是改不了作用域,上下文变量通过函数的能达到一定的效果。

便是this却得不到指向运行eval方法的函数指向的。

 

因为想兼容以前的代码,没有采用eval.apply(this,[])的方法。

有什么好的方法?

 

                           prk   08- 09-11

分享到:
评论
10 楼 鹤惊昆仑 2009-05-09  
使用动态生成<script>标签并且设置其text为json的方式,在firefox下可以比eval快2.4倍左右,在IE下没有明显变化。这种方式在JQuery3中被采用了。IE8的JSON.parser据说性能提高不少,我测试时报告错误,后来才搞清是在IE quirk模式下无法使用。
9 楼 night_stalker 2009-05-08  
这个问题,可以参看这篇文章:

http://weblogs.asp.net/yuanjian/archive/2009/03/22/json-performance-comparison-of-eval-new-function-and-json.aspx

原因探讨:
  • firefox 比 IE 慢很多的原因是 firebug 作怪,把 firebug 关了以后,速度就上去了。(最后速度比较: ie8 > ff3 > ie7 > ie6 > ff2 )
  • ff 里 eval 慢于 Function 的原因是: js 引擎会 cache 一些结果,如果每次都 eval 不同的字符串,就会发现 eval 总是比 Function 快一点点。


修改后的测试代码及结果:(ff3.0.10, 禁用了 firebug)
var benchmark = function(f) {
  var begin = new Date().getTime()
  for(i = 0; i < 3000; i++) f(i);
  //注: 循环次数越小,eval 优势越大。循环次数很大时,两者就很接近了。大概还有其它优化机制在作用。
  alert(new Date().getTime() - begin)
}

var a1 = "{name:'cola', item:[{age:11}, {age:22}, {age:23}, {age:"
var a2 = "}]}"

benchmark(function(i){
  eval("(" + a1 + i + a2 + ")")
})
// 157 ms

benchmark(function(i){
  new Function("return (" + a1 + i + a2 + ")")()
})
// 186 ms


结论: 没必要用 Function 代替 eval 。
8 楼 night_stalker 2009-05-08  
唔…… 在 ff3 测了下,eval 比 ff2 快很多,但还是比不上 Function。

var benchmark = function(f) {
  var begin = new Date().getTime()
  for(i = 0; i < 1000; i++) f();
  alert(new Date().getTime() - begin)
}

var aa="{name:'cola', item:[{age:11}, {age:22}, {age:23}, {age:23}]}"

benchmark(function(){
  eval("(" + aa + ")")
})
//469

benchmark(function(){
  new Function("return (" + aa + ")")()
})
//174

//改写的 eval
eval = function(s){
  new Function("return (" + aa + ")")()
}

benchmark(function(){
  eval(aa)
})
//226
7 楼 lucane 2009-05-08  
学习了,这个确实很严重。。。
6 楼 liyao20050101 2009-03-10  
seaprince 写道
有谁研究过为何FF的eval会这么慢吗?是不是工作机制的原因?

期待。。。
5 楼 dualface 2008-09-22  
不错不错,学到了
4 楼 seaprince 2008-09-19  
有谁研究过为何FF的eval会这么慢吗?是不是工作机制的原因?
3 楼 sp42 2008-09-11  
new Function 额外还有指定scope的方便,——选这个了
2 楼 jljlpch 2008-09-11  
不过eval在IE中的速度还是蛮快的。
1 楼 achun 2008-09-11  
一直在用new Function.
eval关于作用域浏览器见不一致.
还是new Function.对作用域便于控制.
建议彻底放弃eval.

相关推荐

    关于eval 与new Function 到底该选哪个?

    废话不多说,直接上测试代码 代码如下:var aa = “{name:’cola’,item:[{age:11},{age:22},{age:23},{age:23}]}”; var now = new Date().getTime(); for (var i = 0; i ”)

    Testing-Search-function--trec-eval-output:Trec - 使用 TF-IDF 方法进行搜索的评估格式

    使用 TREC 标准化主题集合测试搜索性能。 软件必须以允许 trec_eval 程序生成评估报告的格式将最多前 1000 个搜索结果输出到结果文件中。 trec_eval 期望其输入采用下述格式。 QueryID Q0 DocID Rank Score RunID ...

    JavaScript 解析Json字符串的性能比较分析代码

    解析时用到的方法一般是eval或者new function,而目前IE8和Firefox3.1又内置了原生的JSON对象(据说会有一定的性能提升)。那我们在实际使用的时候怎样从这三种方法(因为性能问题,不考虑用javascript实现的解析)...

    JavaScript性能陷阱小结(附实例说明)

    1.避免使用eval或者Function构造函数 2.避免使用with 3.不要在性能要求关键的函数中使用try-catch-finally 4.避免使用全局变量 5.避免在性能要求关键的函数中使用for-in 6.使用字符串累加计算风格 7.原操作会比函数...

    scoped-function:ScopedFunction =新功能+范围

    ScopedFunction允许您将范围对象注入到Function构造函数中。 可以在函数主体中访问范围对象的属性,就好像它们是闭合变量一样: ScopedFunction('return s;', { s: 'hello' }) -&gt; 'hello' 。 通过JavaScript语法...

    毕业设计-基于Python+卷积神经网络的人脸识别+驾驶员疲劳检测与预警系统的设计与实现.zip

    eval.py 评估网络性能代码 test.py 单张图片测试代码 Ps:没写参数接口,所以要改测试的图片就要手动改代码内部文件名了 l2norm.py l2 正则化 Config.py 配置参数 utils.py 工具类 camera.py opencv 调用摄像头测试 ...

    本科毕设计基于卷积神经网络的疲劳驾驶检测项目源码+数据集+权重文件

    eval.py 评估网络性能代码 test.py 单张图片测试代码 Ps:没写参数接口,所以要改测试的图片就要手动改代码内部文件名了 l2norm.py l2 正则化 Config.py 配置参数 utils.py 工具类 camera.py opencv 调用摄像头测试 ...

    基于卷积神经网络的疲劳驾驶检测

    运行环境(Excution Environment): ...eval.py 评估网络性能代码 test.py 单张图片测试代码 Ps:没写参数接口,所以要改测试的图片就要手动改代码内部文件名了 l2norm.py l2 正则化 Config.py 配置参数 utils.p

    基于卷积神经网络的疲劳驾驶识别检测系统源码+数据集+训练好的数据(python毕业设计).zip

    eval.py 评估网络性能代码 test.py 单张图片测试代码 Ps:没写参数接口,所以要改测试的图片就要手动改代码内部文件名了 l2norm.py l2 正则化 Config.py 配置参数 utils.py 工具类 camera.py opencv 调用摄像头测试 ...

    web性能优化之javascript性能调优

    本文详细介绍Web 开发中关于性能方面需要注意的一些小细节,从 JavaScript 本身着手,介绍了 JavaScript 中需要避免的一些函数的使用和编程规则,比如 eval 的弊端,function scope chain 以及 String 的用法等等

    Javascript模块化管理库jmd.js.zip

    jmd.js 是极小型、高性能 Javascript 模块化管理库(浏览器端)。特点遵循规范,可以像Node.js 一样来写模块代码(参见:AMD、CMD)完全异步,不对源码做任何改动、没eval、setTimeout,全速加载!干干净净,只有一个...

    aotjs:针对WebAssembly和本机的实验性提前JavaScript编译器

    aotjs-JavaScript到LLVM的提前编译 ...不支持运行时eval()或新的Function(“ source”) 内存或执行时间无进程内资源限制 WebAssembly沙箱可以应用硬内存限制 浏览器最终将停止超长循环 要比较的东西 大引擎 Spider

    hive:Node.js中的线程脚本评估

    Hive的主要功能是内置eval函数的异步变体,其中传递的表达式将在Node.js事件循环后面的一个工作线程上的单独上下文中执行。 有关更详细的介绍,请参见随附的博客文章。 注意:事实证明,该项目与更流行的非常相似...

    javascript针对不确定函数的执行方法

    一个方法是用eval&#40;&#41; 执行拼接的程序字符串,但可能带来性能问题。另一个方法是使用符号属性的方式来访问函数,因为函数都是window对象的属性。 利用window[函数名] 来代表该function对象,用window[函数名]...

    micromustache::circled_M:JavaScript的{{mustache}}模板引擎的极其快速且小的实现

    有时,更严格的语法是减少潜在错误并提高性能的正确边界。 该工具的范围有限,它不会尝试解决每个人的用例,而是会做特定的事情。 :person_running: 比MustacheJS更快( Micromustache是​​最快的模板引擎,不需要...

    javascript解析json数据的3种方式

    3种方式解析json数据 代码如下: var obj=eval&#40;“(“+traItem.rel+”&#41;... //性能不好 var obj = (new Function(“return ” + traItem.rel))(); var obj = JSON.parse(traItem.rel); //这个要求的格式比较严格

    正则表达式

    JavaScript的RegExp对象和String对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法. 在JavaScript中,正则表达式是由一个RegExp对象表示的.当然,可以使用一个RegExp()构造函数来创建RegExp...

Global site tag (gtag.js) - Google Analytics