代碼性能優化

手機項目開發比PC項目開發對性能要求更高。簡單點說,就是目前手機性能和PC性能比起來,硬件性能完全不是一個量級,在Pc上跑起來沒什麼問題的項目,搬到手機上,很可能就吃不消甚至卡死。

計算機的房展分爲海量存儲和高性能(PC)、低功耗微型化(手機),雖然現在手機性能跟之前比提升了很多,但是PC性能也提升了很多,兩者還是沒法比。兩者的發展截然相反。另外,兩者使用的不同結構的計算機,從結構上導致了PC和手機的性能差距。

優化方法:

1、減少多餘調用、精簡代碼。

eg:

//重複計算採用臨時變量存儲
if(model.getStance.getState() == 1){

}else if(model.getStance.getState() == 2){

}else{

}
//這裏獲取的都是同一個state,如果model裏面的getState()方法運算量較小,差異不明顯,如果getState()運算複雜,例如需要1秒,那麼這裏因爲計算了兩次,平白無故就多了一秒,如果有更多的if eles,運行速度差異會更加明顯。
可以採用的優化方案是,直接定義一個臨時變量存儲state,這樣不管有多少個if else,都只執行了一次getState()這個方法
//避免重複代碼
private function fun(a:int,b:int):void{
    if(a>b){
        //someCode
        doFun1();
    }else{
        //someCode
        doFun2();
    }
}
以上,兩處的someCode爲相同的代碼
存在重複代碼,可以將重複部分提取出來
private function fun(a:int,b:int):void{
     //someCode
    if(a>b){
        doFun1();
    }else{
        doFun2();
    }
}
雖然只是減少了代碼量,對運行速度並沒有影響,但是手機項目發佈JS文件的時候,對代碼量有限制,而且代碼量更少,下載代碼會更快,除此之外,對於維護成本,以後維護someCode部分的時候,只需要改一處即可,故去掉重複代碼還是很有必要的
var item:* = bagModel.getStance.getItemById(itemId);
if(!item){
    item = new Item();
}
if(!item){
    //someCode
    if(item.ItemOnlyId.compare(numLong)){

    }
}
//這裏其實也可以視爲去掉重複代碼,前面已經判讀了Item不存在的時候,new一個item,所有後面完全沒必要再加一個!item的判斷,必定爲true,除了之外,以上匹配long的時候,可以選用更高效更簡短的equal
用arr.sort()進行排序時,對於int類型的數據,沒必要自己判斷大小,if()直接return a - b或者b - a就行了,

這個沒什麼好說的,精簡代碼。
if(a>b){
    return a;
}else if(b>a){
    return b;
}else{
    return 0;
}
//改成直接return就行了
return a-b;

2、大多數情況下,協議時間單位直接用秒,沒必要用毫秒,一般情況下,考慮到網絡延遲,對於精度要求不高的情況,精確到毫秒並沒有多大意義。而且,用的人還要再用toNumber進行轉化,會增加開銷。故協議裏面用到時間時,推薦直接用int,沒必要用long

3、複用取值不變的對象實例,減少沒必要的頻繁創建

代碼中經常用到的 var arr:Array = [1,2];

這種,其實每次調用方法的時候,都會new一個,如果是僅有此處調用,沒什麼問題,如果是通用接口或者調用頻率較大的接口,就顯得比較浪費了,每次調用都會new,內存分配次數多了, 內存碎片就多,GC(垃圾收集器)開銷就大,GC開銷大到一定程度的表現就是卡頓。

eg:

private function getArr(index:int):Array{
    if(index == 0){
        return [1,2];
    }else if(index == 1){
        return [3,4];
    }else if(index == 3){
        return [4,5];
    }
}
//這種可以直接定義一個static const字典,返回字典對象就行
public static const dic:Object = function ():Object{
    var dic:Object = {};
    dic[0] = [1,2];
    dic[1] = [3,4];
    dic[2] = [4,5];
    return dic;
}();

原方法可以優化爲
private function getArr(index:int):Array{
    return dic[index];
}
//另外,對於經常調用的靜態數據,一開始就Get好,不要每次都get。複用有查詢(計算)成本的對象,減少查詢(計算)開銷
比如配置表總數據,這個可以在解析配置表的時候,直接用obj存起來,下次再調的時候,直接調obj就行,而不用每次都重新解析一次表格

4、被頻繁反覆調用的方法裏,不要用閉包

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章