eval的两组性能测试数据

引发了最近对eval火爆的讨论,刚好之前也做过类似的测试,我也跟风凑个热闹,提供两组数据供大家参考。 

测试环境:

a. 机器:Intel(R) Corei7-2720 2.2Ghz (4核心8线程)、内存8Gb

b. OS:Windows 7 Enterprise SP1 64-bit

c. 浏览器:

    b.1 Google Chrome 21.0.1180.79 m

    b.2 Firefox 14.0.1

    b.3 IE9.0.8112.16421

d. 测试方法

    d.1 每个用例测试5次,耗时取最小值。 

    d.2 测试过程中没有开启Firebug或Chrome Console,开启这些工具会使时间倍增,很难在有效时间内得到该用例结果

 

用例A1:

我们在内联函数中调用空的eval("") 

! function() {
     var a = 1,
        b = 2,
        c =  true;
     function func() {
         var d = 2;
            e = !c;
              eval("");
    }
     for ( var i = 0; i < 2999999; i++) {
        func(i, i + 1, i + 2);
    }
}();

 

用例A2: 

注释掉内联函数中的eval("") 

!function() {
     var a =  1,
        b =  2,
        c =  true;
    function func() {
         var d =  2;
            e = !c;
            //eval("");
    }
     for ( var i =  0; i <  2999999; i++) {
        func(i, i +  1, i +  2);
    }
}();

 

用例A3:

为排除eval("")调用本身产生的影响,我们在外层函数中调用eval("") 

!function() {
     var a =  1,
        b =  2,
        c =  true;
    function func() {
         var d =  2;
            e = !c;         
    }    
     for ( var i =  0; i <  2999999; i++) {
         eval("");
        func(i, i +  1, i +  2);
    } 
}();

 

用例A4:

将eval()函数覆盖成普通的空函数 

function eval(){}
!function() {
     var a =  1,
        b =  2,
        c =  true;
    function func() {
         var d =  2;
            e = !c;
             eval("");
    }
     for ( var i =  0; i <  2999999; i++) {
        func(i, i +  1, i +  2);
    }
}();

 

用例A5:

同样是函数调用,不是eval而且另一个空函数f 

function f(){}
!function() {
     var a =  1,
        b =  2,
        c =  true;
    function func() {
         var d =  2;
            e = !c;
             f("");
    }
     for ( var i =  0; i <  2999999; i++) {
        func(i, i +  1, i +  2);
    }
}();

  

用例A6:

将eval赋给另一个变量f,然后调用f 

var f = eval;
!function() {
     var a =  1,
        b =  2,
        c =  true;
    function func() {
         var d =  2;
            e = !c;
             f("");
    }
     for ( var i =  0; i <  2999999; i++) {
        func(i, i +  1, i +  2);
    }
}();


用例A7:

使用eval.call的方式去调用 

 

!function() {
     var a =  1,
        b =  2,
        c =  true;
    function func() {
         var d =  2;
            e = !c;
             eval.call(null, '');
    }
     for ( var i =  0; i <  2999999; i++) {
        func(i, i +  1, i +  2);
    }
}();

 

 

A组测试结果: 

 A1 A2A3A4 A5A6A7A1 : A2A1 : A3A1 : A4A4 : A5
Chrome1612ms8ms1244ms897ms7ms718ms680ms201.51.31.8128.1
Firefox2468ms69ms732ms2928ms134ms5033ms4984ms35.83.40.821.9
IE1207ms23ms233ms1147ms37ms148ms224ms52.55.21.031.0

 

 用例B1:

for ( var i =  0; i <  2999999; i++) {
    !function() {
         var a =  1,
            b =  2,
            c =  true;
        !function () {
             var d =  2;
                e = !c;
                 eval("");
        }();
    }();
}


用例B2:

for ( var i =  0; i <  2999999; i++) {
    !function() {
         var a =  1,
            b =  2,
            c =  true;
        !function () {
             var d =  2;
                e = !c;
                 //eval("");
        }();
    }();
}


用例B3:

for ( var i =  0; i <  2999999; i++) {
    !function() {
         var a =  1,
            b =  2,
            c =  true;
        !function () {
             var d =  2;
                e = !c;               
        }();
    }();
     eval("");
}

 

用例B4:

var eval = function(){}
for ( var i =  0; i <  2999999; i++) {
    !function() {
         var a =  1,
            b =  2,
            c =  true;
        !function () {
             var d =  2;
                e = !c;
                 eval("");
        }();
    }();
}

 

用例B5:

var f = function(){}
for ( var i =  0; i <  2999999; i++) {
    !function() {
         var a =  1,
            b =  2,
            c =  true;
        !function () {
             var d =  2;
                e = !c;
                 f("");
        }();
    }();
}

  

用例B6:

var f = eval;
for ( var i =  0; i <  2999999; i++) {
    !function() {
         var a =  1,
            b =  2,
            c =  true;
        !function () {
             var d =  2;
                e = !c;
                 f("");
        }();
    }();
}

 

用例B7:

for ( var i =  0; i <  2999999; i++) {
    !function() {
         var a =  1,
            b =  2,
            c =  true;
        !function () {
             var d =  2;
                e = !c;
                 eval.call(null'');
        }();
    }();
}

 

 

 B组测试结果:

 B1B2B3B4B5B6B7B1 : B3B1 : B2B1 : B4B4 : B5
Chrome1569ms134ms1093ms1022ms173ms830ms916ms11.71.41.55.9
Firefox5334ms1017ms5503ms5280ms1171ms6797ms6883ms5.21.01.04.5
IE3933ms560ms680ms4118ms583ms745ms854ms7.05.81.0111.3

  

结论(仅限于文中的CASE):

1.  eval本身的重复调用非常耗时,即使是空的eval("");

2.  eval对内联函数执行效率有所影响,依具体环境、代码有所不同;

3.  我们可以看到无论哪种浏览器,无论是A组还是B组,2 和 5速度较佳。说明例中内联函数的eval无论以何种方式调用(即使eval被空函数覆盖)仍会对运行效率造成较大影响。推断是(黑盒推断,非权威,很可能是臆测)内联函数中只要发现eval,哪怕这个eval是被覆盖的空函数,在Scope Variables中都将会把所有的外部定义的变量等内容初始化到当前的Scope中。类似的,eval会对内联函数在运行时JS引擎的优化功能产生较大影响,降低执行效率。

4. 说点题外话,虽然没用IE10,而是IE9,在对eval的处理上,表现非常的优异。IE一直被开发人员诟病,但它的飞速成长也是值得肯定的,本例就是很好的一项证明。 

 

转载于:https://www.cnblogs.com/bosnma/archive/2012/08/16/2643268.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值