As3.0的一些优化
As3.0的一些优化
我一直在钻研ActionScript的优化方案,并发现了一些非常有趣的结果。虽然在本文中没有什么新的知识,但文中一些部分参照了本文最后附上链接上的一些文章。
数据索引(Array indexing)
我们来看遍历数组的例子:
private function method1():void { var tmpVar:int; for(var i:Number=0;i<testArray.length;i++) { tmpVar=testArray[i]; } } |
让这个方法循环运行50次,得到的平均速度为53.34毫秒。现在将迭代变量i从Number类型改为int类型。
for(var i:int=0;i<testArray.length;i++) |
这次的结果显示平均时间为35.58毫秒,这是因为使用int类型来检索数组会更快。我们还可以通过将数组长度(testArray.length)从for语句中分离出来。
var l:int=testArray.length; for(var i:int=0;i<l;i++) |
需要的平均时间为21.6毫秒。
译者注:
int 类可使用表示32带符号整数的数据类型(Flex4.0 API)。用x表示一位,int即 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx Number 数据类型可使用多达 53 位来表示整数值(Flex4.0 API)。 那么用x来表示Number类型的位数,似乎一行难以写下。从表面上,便可以看出两者的效率问题。
整数压缩的一种算法也利用了这一原则,(补充) |
来自其他类的常量
另一种优化方法是使用来自其他类的常量。请看下面的例子:
var tmpVar:int; for(var i:Number=0;i<100000;i++) { tmpVar=SomeClass.SOME_CONSTANT; } |
这段代码的执行时间为34.08。如果我们将常量从for循环中拿出来,见如下:
var tmpVar:int; var myConstant:int=SomeClass.SOME_CONSTANT; for(var i:Number=0;i<100000;i++) { tmpVar=myConstant; } |
现在只需要15.8毫秒。
变量的初始化。
以如下的风格初始化:
for(var i:int=0;i<100000;i++) { var v1:Number=10; var v2:Number=10; var v3:Number=10; var v4:Number=10; var v5:Number=10; } |
共花费了46.52毫秒。这段代码的执行效率应该会更高,如果只使用一次关键字var,并将这些变量声明在一行内。如:
for(var i:int=0;i<100000;i++) { var v1:Number=10,v2:Number=10,v3:Number=10,v4:Number=10,v5:Number=10; } |
这样仅仅19.74毫秒就执行完毕。
位移运算
位移运算能提高运算速度。就拿乘除做例子。
for(var i:int=0;i<100000;i++) { var val1:int=4*2; var var2:int=4*4; var var3:int=4/2; var var4:int=4/4; } |
平均花费的时间为49.12毫秒,使用位移运算能使时间消耗下降至35.56毫秒。
for(var i:int=0;i<100000;i++) { var val1:int=4<<1; var var2:int=4<<2; var var3:int=4>>1; var var4:int=4>>2; } |
原文连接
http://www.rozengain.com/blog/2007/05/01/some-actionscript-30-optimizations/ |
—————————————————————————————————————
译者心得
测试方式。
以前自己测试效率的步骤是:
(1) 第一次获取时间,
(2) 运行for语句,
(3) 第二次获取时间。
得到第一,二次时间差,即for语句的运行时间。
在上文,可以看到,作者采用的50次运算的平均时间。平均时间比运行一次的时间会显得更准确。因为运行一次,有可能受到某些因素的干扰。