隨著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