关于编写高性能AS3代码(转)

欢迎转载,请注明出处!阿希小鱼

最近研究swf文件格式以及AVM2的运行机制看到一些东西,也得到一些体会:

1、变量要尽量指明类型。AS3中类型的申明会使得将类型值存储为原生机器类型时候更加高效,而且能够减少内存消耗。对于对内存和CPU有较高要求的应用来说应该注意这一点。

2、数字尽量使用int型。int,uint都是4个字节,Number可能是8个字节或者16个字节。
对于具体的函数调用过程中应该要尽量让结果类型明确,举个例子:

    var i:int = 1;
    var j:int = i+1
    fun(i+1)
    //该例子中,i和j都是int型,但是fun传入的参数已经转换成Number型了。
    //以下也是需要避免的:
    var i:int;
    for (i=0; i<10000; i++) {
        array[i*2] = 0;//这里i*2被转换成Number类型
    }
    // 使用强制类型转换之后执行效率更高
    for (i=0; i<10000; i++) {
        array[int(i*2+1)] = 1;
    }

3、数组操作要注意。这也是一个老话题了,不光是在AS3中应该这样,其他语言也是一样的。
下面给出了例子:

for (var i:int=0; i<array.length; i++)
    {
        fun(array[i]);
    }
    //这种情况不但容易留下bug,也会造成性能降低,array.length会被执行很多次。正确的方式是这样的:
    var length:int = array.length;
    for (var i:int=0; i<length; i++)
    {
        fun(array[i]);
    }

4、尽量不要使用匿名函数。通常对于一些功能比较简单的函数,我们可能直接写成function():void{}的形式,例如:

netStream.addEvent(NetStatusEvent.NET_STATUS,function(e:NetStatusEvent):void{});
    //这样的用法会降低程序性能,最好写的标准一点,比如:
    function fun(e:NetStatusEvent):void
    {}
    netStream.addEventLisener(NetStatusEvent.NET_STATUS,fun);

5、字符串的操作在很多语言里头都是有专门的类来实现的,例如StringBuilder之类的东西就是专门为提高字符串操作性能而产生的。在AS3中,+运算符被重载了,它能够完成其他语言中StringBuilder干的事情。

但是对于TextField而言,它还提供了appendText方法,这个东西的性能比+更高。

从原理上来说,有些语言中如果不使用StringBuilder,1000次字符串的相加会产生大概100个左右的字符串,而AS3中最后只有一个,通过prefix的方式添加进去。

6、通常程序设计都希望使用含义明确的函数名,比如:parseCommontypeToConcrete之类的函数名,实际上在AVM2中,函数名并没有进行类似于js之类的压缩,而是完整的存放在swf中的constant_pool中的,就是说使用的函数名越长,这个部分的体积是越大的。

7、不要在构造函数中实现复杂的功能。AVM2中,构造函数的代码是解释执行的,其他代码是JIT,如果有什么比较消耗性能的事情,最好不要在构造函数中干。

8、在AVM2中也是可以有非托管代码的,用delete可以自己手动回收内存。在AVM2中有两张表,RC和ZCT,即引用计数和0计数表,和COM组件的实现方式非常类似。

但是AVM2并不总是监听ZCT以实时回收资源,而是在资源比较紧张的时候才会回收,这个也是程序设计里头的一个比较基础的思想。

本身flash也提供了gc()功能,也有一些人使用hack促发AVM2提前执行垃圾回收的动作。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>