代码性能优化

手机项目开发比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、被频繁反复调用的方法里,不要用闭包

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值