随着Flash的ActionScript功能的不断强大,使用Flash制作应用程序也越来越多了,但让众多AS程序员最头疼的就是Flash的程序处理效率太低,就算现在flashplayer7虽然效率比flashplayer6提高了2~8倍,但还是低的要命,尤其是在手持设备中就更加严重了(在PPC上现在Flash2004的所有组件都没法使用,需要自行开发),这样就让很多as程序员不断的研究比较action中哪个方法效率更高,哪条指令更快.甚至有些人只用while循环而不用for循环(因为很多测试表明while循环比for循环要快一点),但这种做法实际上没快多少确让程序读/写起来都要麻烦许多,其实真正提高程序的效率,不是比较类似while for循环哪个更快,而是要找到程序效率低的瓶颈
一段程序的效率,最关键的看算法,就算用最快的计算机语言(比如用c),如果算法不好,大部分执行时间都是被浪费掉了,而不是充分利用起来,那程序一样会很慢,而如果算法得当,可能解决问题根本就不用很大量的计算,因此即使使用效率很低的action一样能很快的解决(虽然action很慢,但每秒一样能循环循环几十万次,同样能在很短的时间内完成很多事情,所谓慢是比较更快的程序语言来说的)
在这里咱们不谈算法,单独从FlashPlayer上说,怎么才能提高action的效率呢?要提高效率就要抓住根本,抓住Flash为什么运行的慢,action执行效率低,最根本的原因是action是解释性语言,每句代码都需要flashplayer去解释执行,这就是action执行效率低的根本原因,那如果去提高action的效率呢?去比较哪句action的效率更高吗,所有的action都是player去解析的,肯定相差不大,那怎么办呢?当然就是尽量少使用action进行处理
大家都知道FlashPlayer是用c语言来写的,那flash里面的所有内置函数肯定都是使用c语言实现的(虽然flash执行action的速度比较慢,但flash的内置函数确实非常快的,比如flash下Math下面的方法都是效率很高的),那我们如果能把我们原来用action来处理的方法改用flash内部方法来处理就肯定要快多了
那怎么才能使用内置方法代替action呢,这个要看个人水平跟对Action的熟悉程度了,下面介绍一个例子,来解释一下:
action程序员都知道action处理String的效率是非常低的,可是说低的可以,下面代码可以说明:
var str = "abcde";
var tmp = "";
var time1 = getTimer();
for(var i=0;i < 10000;i++){
tmp += str;
}
trace(getTimer() - time1);//1665
将10000个5个字母的字符串连接起来竟然需要1.5s以上的时间(cpu: pm1.4)
而改成10个字母就需要使用4s左右的时间,15个字母就需要5.5s左右的时间
随着字符串的变长,字符串处理的速度越来越低
那怎么能让字符串连接的更快呢?看一看下面这段代码:
time1 = getTimer();
var tmpA = new Array();
for(var i=0;i < 10000;i++){
tmpA[i] = str;
}
var tmp1 = tmpA.join("");
trace(getTimer() - time1);
trace(tmp1 == tmp);
这段代码是接在上面的代码后面的,这里思路有所不同的是,在这里先把字符串一个一个的付给数组,然后利用数组的join方面一下子将整个数组转换为字符串,你也许会想,先付给数组,然后再有数组转换,肯定会更慢.但实际上不是这样的,因为赋值语句在as里面是很快的,所以将10000个字符串付给数组花不了多长时间,而最后调用的数组的方法是as内部函数,完全有c实现的,因此肯定要比as实现快很多倍,因此整体速度跟上面的代码就相差很多了,而且随字符串增长,效率也不会明显降低,下面是执行结果:
同样为10000个字符串连接,5个字符第二种方法只需要140ms,比直接连接字符串快10倍左右,而后面的比较输出true说明两个字符串是一样的
而且当字符串加置10个,15个甚至更多的时候,效率并没有降低,而仍然用时140ms左右,而当字符串长度达到40的时候,用时才超过了200ms