拥抱Javascript性能

作者:李丽媛


邮件:lly219#gmail.com


 


前言


在涉及JavaScript性能优化之前想和大家探讨一
下:过早优化


Donald
Knuth

曾经说过:“过早优化是万恶之源”(Premature optimization is the root of all
evil

)。


在他的论文——Structured
Programming with go to Statements

中,他写到"编程者花费大量的时间去思考,担心,他们程序中并不占关键部
分的效率问题,然而这些在debugging和考虑程序维护的实际中有着很强的负面影响。我们应该忘记小的效率所带来的影响,比如说97%的时间:过早优
化是万恶之源。"

也就是说我们不应该错过关键的3%,一个好的程序员不会花大量的时间在如何提高并不占关键部分的性能效率,他所关注的是关键部分
的代码;但这通常在代码确定后。

简而言之就是说:过早关注不重要的部分,而忽略行动和目标本身。以静态的思维来优化,殊不知,事务发展总是动态
的,“优化”是需要长期的实
践积累才可以获得。出发点是好的,但往往好心办坏事,折腾大量的时间,做了很多不该做的,而该做的、重要的反而没做。强化外部条件、工具等外在,而忽略内
在因素和行动本身,或者,过多期望将来,而忽略当下眼前。


“DO NOT, EVER, OPTIMIZE PREMATURELT!”


 


正文






1.避免函数调用


function methodCall(){

  
 function square(n){ return nn };

    var i=10000, sum = 0;

  
 while(i-­‐) sum += square(i);

}



function inlinedMethod(){

  
 var i=10000, sum = 0;

    while(i-­‐) sum += i
i;

}






注:在IE8中methodCall()将在1s后弹出警告框:A script on
this page is causing Internet Explorer to run slowly.If it continues to
run, your computer might become unrespensive.



2.拥抱语言


2.1


function
literals(){

    var a = [], o = {};

}

function classic(){

  
 var a = new Array, o = new Object;

}






2.2


parseInt(12.5);


~~(1
"12.5")










3循环


3.1


var test =
‘’;

for (var i = 0;i<10000;i++)

    test = test + str;



var
test = ‘’, i = 10000;

while(i–) test = test + str;



 






3.2


function normalLoop(){

var
i=60, j=0;

while(i-‐) j++;

}



function unrolledLoop(){

var
j=0;

j++; j++; j++; j++; j++; j++;

j++; j++; j++; j++; j++; j++;

j++;
j++; j++; j++; j++; j++;

j++; j++; j++; j++; j++; j++;

j++; j++;
j++; j++; j++; j++;

j++; j++; j++; j++; j++; j++;

j++; j++; j++;
j++; j++; j++;

j++; j++; j++; j++; j++; j++;

j++; j++; j++; j++;
j++; j++;

j++; j++; j++; j++; j++; j++;

}






4全局 cache


function
uncached(){

var i = 10000;

while(i-­‐) window.test = ‘test’;

}



function
cached(){

var w = window, i = 10000;

while(i-­‐) w.test =
‘test’;






5表达式交换


var b = false, n = 99;

function(){

return
nn && b;

}



function(){

return b && n*n;

}






6不需要使用的部分


6.1


function(){

var
obj = { prop: ‘test’, str: ‘’ };

    with(obj){

    var i =
10000;

    while(i-­‐) str += prop;

        return str;

  
 }

}

function(){

var obj = { prop: ‘test’, str: ‘’ }, i =
10000;

while(i-­‐) obj.str += obj.prop;

return obj.str;

}






6.2


var a = 0;

function(){

  
 try{

        a += 1;

    } catch(e) {}

}



function(){

  
 a += 1;

}










参考文献:



《Extreme
JavaScript Performance》

http://c2.com/cgi/wiki?PrematureOptimization

http://www.watch-life.net/life-thinking/no-premature-optimization.html

http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf


 


转载请注明作者信息和出处,Thx


:)