首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • eval效率问题,欢迎各位进入讨论! [已结贴,结贴人:jackker]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 18:37:16 楼主
    例子代码一号:
    ------------------------------------------
    <script>
    eval("function test(){...}");
    </script>
    <script>
    //这里开始进行1万次test方法调用.
    for(var i=0;i <10000;i++){
    test();
    }
    </script>


    例子代码二号:
    ------------------------------------------
    <script>
    function test(){...}
    </script>
    <script>
    //这里开始进行1万次test方法调用.
    for(var i=0;i <10000;i++){
    test();
    }
    </script>


    问题:请问1号代码和2号代码,在第二段进行1万次test方法调用时的效率是否一样?
    那么,他们的区别是否就是在于,在进行初始化的时候,一号代码略慢于二号代码?
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 18:44:001楼 得分:0
    自己试一下呀
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 19:20:472楼 得分:0
    。。。。这问题自己调试下加一个运行时间比较下就知道了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 20:02:363楼 得分:0
    eval不仅仅是效率的问题少用的...效率只是一个方面...

    尽量少用~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-18 20:54:324楼 得分:0
    1万次应该没什么太大的区别.
    经过eval之后,里面的串已经被 JScript 分析器进行分析和执行了.
    而是否经过eval来处理,则仅仅是多了一步是直接由jscript分析器来处理,还是将字符串作为源代码来动态执行。
    其他见解继续...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • FEB15
    • 等级:
    发表于:2008-05-23 13:21:055楼 得分:0
    同意楼上的,JavaScript本身都是文本,本身就是晚期绑定机制,eval只是你晚期注入一段代码,效率偏差应该不大。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-23 14:17:286楼 得分:80
    没有区别。因为两种情况的test()方法都是在全局闭包空间的。

    注意,如果test()在全局闭包空间,而eval被放在一个函数内执行,那么eval的效率要低些(js的作用域链起作用,js总是先在局部去找变量或方法,局部没有再去上一层左右空间找,一直到全局空间)。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-23 16:15:137楼 得分:0
    引用 4 楼 myvicy 的回复:
    1万次应该没什么太大的区别.
    经过eval之后,里面的串已经被 JScript 分析器进行分析和执行了.
    而是否经过eval来处理,则仅仅是多了一步是直接由jscript分析器来处理,还是将字符串作为源代码来动态执行。
    其他见解继续...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-23 18:43:558楼 得分:0
    p;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mumuTiger
    • 等级:
    发表于:2008-05-24 00:45:229楼 得分:0
    时间太短,时间加大,看看区别在哪里 呵呵


    test

    JScript code
    <script> var d= new Date().getTime() eval("function test(){}"); </script> <script> //这里开始进行1万次test方法调用. for(var i=0;i <100000;i++){ test(); } var d2 = new Date().getTime(); alert(d2-d); </script> <script> var d3= new Date().getTime(); function test(){} </script> <script> //这里开始进行1万次test方法调用. for(var i=0;i <100000;i++){ test(); } var d4= new Date().getTime(); alert(d4-d3); </script>
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-08 00:03:3510楼 得分:0
    有可能。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-10 10:45:3911楼 得分:20

    eval 及 json赋值的性能测试


    代码:
    <script>
    var n=200000;
    function test(){
        var s;
        var t1=(new Date()).getTime();
        for(var i=0;i <n;i++)
            s=1000*1000/1000;
        var t2=(new Date()).getTime();
        return (t2-t1);
    }
    function evaltest(){
        var s;
        var t1=(new Date()).getTime();
        for(var i=0;i <n;i++)
            eval("s=1000*1000/1000;");
        var t2=(new Date()).getTime();
        return (t2-t1);
    }
    function jsontest(){
        var s;
        var t1=(new Date()).getTime();
        for(var i=0;i <n;i++)
            s={"DataCount":5000,"jsonRoot":[{"title":"标题","staff":{"UserName":"test","Age":20},"id":2}]};
        var t2=(new Date()).getTime();
        return (t2-t1);
    }
    function jsonevaltest(){
        var s;
        var t1=(new Date()).getTime();
        for(var i=0;i <n;i++)
            eval('s={"DataCount":5000,"jsonRoot":[{"title":"标题","staff":{"UserName":"test","Age":20},"id":2}]};');
        var t2=(new Date()).getTime();
        return (t2-t1);
    }
    document.write (" <br>算术运算测试(正常):"+test()+" 毫秒");
    document.write (" <br>算术运算测试(eval):"+evaltest()+" 毫秒 <br>");
    document.write (" <br>JSON赋值测试(正常):"+jsontest()+" 毫秒");
    document.write (" <br>JSON赋值测试(eval):"+jsonevaltest()+" 毫秒");
    </script>


    在 Athlon64 3000+ IE6 上运行结果:

    算术运算测试(正常):121 毫秒
    算术运算测试(eval):1969 毫秒

    JSON赋值测试(正常):1906 毫秒
    JSON赋值测试(eval):4922 毫秒
    UID2119 帖子5 精华0 积分75 阅读权限1 在线时间7 小时 注册时间2007-11-8 最后登录2007-12-8 查看详细资料
    TOP

    P4 2.6c  ,ie6

    算术运算测试(正常):141 毫秒
    算术运算测试(eval):3953 毫秒

    JSON赋值测试(正常):3891 毫秒
    JSON赋值测试(eval):9343 毫秒
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-10 11:00:3612楼 得分:0
    引用 6 楼 zhouruitao 的回复:
    没有区别。因为两种情况的test()方法都是在全局闭包空间的。

    注意,如果test()在全局闭包空间,而eval被放在一个函数内执行,那么eval的效率要低些(js的作用域链起作用,js总是先在局部去找变量或方法,局部没有再去上一层左右空间找,一直到全局空间)。




    同意!

    <input type="text" id="a" value="0">
    <input type="text" id="b" value="0">

    <script>
    var aT = new Date();
    for(var i=0;i <10000;i++){
    eval("function test1(){document.getElementById('a').value++}");
    test1();
    }
    document.getElementById('a').value += ","+(new Date()-aT);

    var bT = new Date();
    for(var i=0;i <10000;i++){
    function test(){document.getElementById('b').value++}
    test();
    }
    document.getElementById('b').value += ","+(new Date()-bT);
    </script>
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wdbjsh
    • 等级:
    发表于:2008-06-10 11:07:1713楼 得分:0
    我塞 居然要低1.5个数量级,够吓人哦
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
    Copyright © 2000-2007, CSDN.NET, All Rights Reserved