提高flash程序效率的方法(转载)

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

回复Comments

{commenttime}{commentauthor}

{CommentUrl}
{commentcontent}