2011-06-06 98 views
0

我嘗試使用ActionScript 3自定義排序功能瓶頸

的問題進行梳理大陣的是,我必須使用自定義排序功能是痛苦的緩慢,導致Flash插件崩潰。

下面是使用其成員的長度進行排序數組的自定義功能的示例代碼:

  private function sortByLength():int { 
       var x:int = arguments[0].length; 
       var y:int = arguments[1].length; 
       if (x > y){ 
        return 1;      
       }else if (x < y){ 
        return -1; 
       }else{ 
        return 0; 
       } 
      } 

被稱爲像這樣:

var txt:Array = ["abcde","ab","abc","a"]; 
    txt.sort(sortByLength); 

請告訴我怎麼能這樣做會更快嗎?

如何更改應用程序邏輯以避免排序過程中Flash插件崩潰?

回答

2

嘗試儘可能使用強類型,這裏告訴你的函數你正在等待兩個字符串。

你可以重寫你的函數有兩種方式一個最快的比,如果你知道,所有的元素都不能爲null另:

function sortByLength(a:String, b:String):int { 
    return a.length-b.length // fastest way not comparison 
} 

,如果你能有空檢查它(這個會把空在所有元素的前面):

function sortByLengthWithNull(a:String, b:String):int { 
    if (a==null) return -1 
    if (b==null) return 1 
    return a.length-b.length 
} 
+1

看起來不錯,但我認爲這不應該更快。 – Eugeny89 2011-06-06 17:15:46

+0

謝謝你的回覆,我當然接受它。但是有一個問題沒有答案 - 如何在Flash中執行貪婪的計算而不掛上它?例如,你的函數在具有200000+個成員的數組上失敗。如何更改應用程序邏輯以避免CPU密集型任務期間Flash插件崩潰(如排序大數組)? – Termos 2011-06-06 17:16:59

+1

@ Eugeny89不要猜測,但嘗試;)它會更快的工作,因爲:你消除了參數[]的指針數組訪問,你消除了代價昂貴的分支。現在,如果您使用不太多的數據進行測試,您將看不到差異。 – Patrick 2011-06-06 17:33:43

1

sortByLength應該有兩個參數,不應該嗎?我想這就是你在arguments陣列的意思......

這看起來好像沒什麼問題,除非arguments不是一個局部變量,而是一個成員變量,你只是在其[0][1]元素看好每個函數調用。那至少會產生不希望的結果。

+0

我新的AS3,但據我所知它的工作方式是:自定義函數被調用檢查每個數組元素每次比較兩個數組元素,所以參數[0]和參數[1]是正在比較的數組元素 – Termos 2011-06-06 16:45:27

+0

查看Array文檔(http://help.adobe.com/zh_CN/FlashPlatform/reference /actionscript/3/Array.html#sort()),它提到sort函數應該有兩個參數,而且我一直這樣做沒有問題,我不知道這與它有什麼關係特別的問題雖然 – 2011-06-06 16:49:11

2

如果您需要超快速排序,那麼它可能是值得不使用數組所有,而是使用鏈表。每個人都有不同的優點。首先,鏈接列表的索引訪問速度很慢,而遍歷列表的速度很快,並且鏈接列表不是AS3本機的,因此您必須自行推出。

好的,你可能會使用一些Polygonal Labs的代碼:http://lab.polygonal.de/as3ds/

正如本文所討論的那樣,排序對於具有鏈表的近似排序數據非常非常快速:http://lab.polygonal.de/2007/11/26/data-structures-more-on-linked-lists/

該解決方案爲您提供了更多的工作,但最終還會爲您提供更多的分揀速度。

希望這會有所幫助。

- 額外 -

我注意到你的問題在關於「然而,一個問題是沒有答案另一個答案的評論 - 如何執行在Flash貪婪計算,而不掛呢?「

爲此,實質上答案是在多個幀打破你的計算,這樣的事情:

public function sort():void 
{ 
    addEventListener(Event.ENTER_FRAME, iterateSort); 
} 

private function iterateSort():void 
{ 
    var time:int = getTimer() + TARGET_MILLISECONDS_PER_FRAME; 
    var isFinished:Boolean = false; 

    while (!isFinished && getTimer() < time) 
     isFinished = continueSort(); 

    if (isFinished) 
     removeEventListener(Event.ENTER_FRAME, iterateSort); 
} 

function continueSort():Boolean 
{ 
    ... implement an 'atom of sort' here, whatever that means ... 
} 
+0

定位長度查找是O(n)和縮放線性,因爲鏈接列表通常不會緩存長度 - 儘管似乎多邊形確實盡力嘗試並保持同步。所以如果他有20000多個元素,他需要從0到20000個元素去尋找長度。 – simonrichardson 2011-07-12 15:20:20