作者:李丽媛

邮件: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 n*n };
    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 n*n && 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

:)