5、避免双重解释
双重解释的情况也是我们经常会碰到的,有的时候我们没怎么考虑到这种情况会影响到效率,双重解释一般在我们使用eval、new Function和setTimeout等情况下会遇到,我们看看下面的例子:
广州网站建设,网站建设,广州网页设计,广州网站设计
- <div id="demo"></div>
- <input id="but1" type="button" onclick="func1()" value="效率低"/>
- <input id="but2" type="button" onclick="func2()" value="效率高"/>
- var sum, num1 = 1, num2 = 2;
- function func1(){
- var start = new Date().getTime();
- for(var i = 0; i < 10000; i++){
- var func = new Function("sum+=num1;num1+=num2;num2++;");
- func();
- }
- var end = new Date().getTime();
- alert("用时 " + (end - start) + " 毫秒");
- }
- function func2(){
- var start = new Date().getTime();
- for(var i = 0; i < 10000; i++){
- sum+=num1;
- num1+=num2;
- num2++;
- }
- var end = new Date().getTime();
- alert("用时 " + (end - start) + " 毫秒");
- }
第一种情况我们是使用了new Function来进行双重解释,而第二种是避免了双重解释,我们看看在不同浏览器下的表现:
可以看到,在所有的浏览器中,双重解释都是有很大开销的,所以在实际当中要尽量避免双重解释。
感谢"SeaSunK"对第四点测试报告错误的指正,现在已经修改过来了。至于最后一点提出的func1每次都初始化,没有可比性,所以我给换了eval,结果发现,在IE6.0下还是有影响,而且在Firefox下,使用eval对效率的影响程度更加厉害,在Firefox下,如果10000次循环,需要十多秒的时间,所以我把循环都变成了1000次。看代码和报告。
- var sum, num1 = 1, num2 = 2;
- function func1(){
- var start = new Date().getTime();
- for(var i = 0; i < 1000; i++){
- eval("sum+=num1;num1+=num2;num2++;");
- }
- var end = new Date().getTime();
- alert("用时 " + (end - start) + " 毫秒");
- }
- function func2(){
- var start = new Date().getTime();
- for(var i = 0; i < 1000; i++){
- sum+=num1;
- num1+=num2;
- num2++;
- }
- var end = new Date().getTime();
- alert("用时 " + (end - start) + " 毫秒");
- }
原文链接:http://www.cnblogs.com/lookhan/archive/2012/06/14/2549639.html