自定义排序功能瓶颈

时间:2011-06-06 16:18:10

标签: actionscript-3 actionscript

我正在尝试使用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插件崩溃?

3 个答案:

答案 0 :(得分:2)

尝试尽可能使用强类型,这里告诉你的函数你正在等待两个字符串。

如果您知道所有元素都不为空,那么您可以以两种方式快速重写您的函数:

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

如果你可以对它进行空检查(这个将在所有元素前放置null):

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

答案 1 :(得分: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 ...
}

答案 2 :(得分:1)

sortByLength应该有两个参数,不应该吗?我猜你的意思是arguments数组......

这对我来说很好,除非arguments不是局部变量,而是一个成员变量,而你只是查看每个函数上的[0][1]元素呼叫。这至少会产生不希望的结果。

相关问题