2011-06-06 96 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