欢迎转载,请注明出处!阿希小鱼
最近研究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提前执行垃圾回收的动作。