Actionscript 3 自定义排序功能瓶颈

Actionscript 3 自定义排序功能瓶颈,actionscript-3,actionscript,Actionscript 3,Actionscript,我正在尝试使用ActionScript3对大数组进行排序 问题是,我必须使用自定义排序功能,这是痛苦的缓慢,并导致闪存插件崩溃 下面是用于按数组成员长度排序的自定义函数的示例代码: private function sortByLength():int { var x:int = arguments[0].length; var y:int = arguments[1].length;

我正在尝试使用ActionScript3对大数组进行排序

问题是,我必须使用自定义排序功能,这是痛苦的缓慢,并导致闪存插件崩溃

下面是用于按数组成员长度排序的自定义函数的示例代码:

            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;
                }
             }

请告诉我如何才能更快地做到这一点


如何更改应用程序逻辑以避免闪存插件在排序过程中崩溃?

sortByLength应该有两个参数,不是吗?我想这就是你所说的
参数
数组的意思


我觉得这很好,除非
参数
不是一个局部变量,而是一个成员变量,您只需查看每个函数调用中的
[0]
[1]
元素。这至少会产生不想要的结果。

sortByLength
应该有两个参数,不是吗?我想这就是你所说的
参数
数组的意思


我觉得这很好,除非
参数
不是一个局部变量,而是一个成员变量,您只需查看每个函数调用中的
[0]
[1]
元素。这至少会产生不想要的结果。

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

如果您知道所有元素都不是空的,则可以以两种方式重写函数,一种方式最快,另一种方式最快:

function sortByLength(a:String, b:String):int {
    return a.length-b.length // fastest way not comparison
}
如果您可以对其进行null检查(此项将在所有元素前面放置null):


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

如果您知道所有元素都不是空的,则可以以两种方式重写函数,一种方式最快,另一种方式最快:

function sortByLength(a:String, b:String):int {
    return a.length-b.length // fastest way not comparison
}
如果您可以对其进行null检查(此项将在所有元素前面放置null):


如果您需要超快速排序,那么完全不使用数组而使用链表可能是值得的。每种方法都有不同的优点。首先,对于链表,索引访问速度很慢,而遍历链表的速度很快,而且链表不是AS3所固有的,因此您必须自己滚动

从好的方面来说,您可以使用Polygol实验室的一些代码:

对于带有链表的几乎已排序的数据,排序非常非常快,正如本文所讨论的:

这个解决方案会给你更多的工作,但最终也会给你更多的排序速度

希望这有帮助

--附加的--

我在另一个答案的评论中注意到了你的问题,“但是有一个问题没有答案——如何在Flash中执行贪婪的计算而不挂起它?”

对于这一点,基本上答案是在多个帧上中断计算,如下所示:

    var txt:Array = ["abcde","ab","abc","a"];
    txt.sort(sortByLength);
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 ...
}
公共函数排序():void
{
addEventListener(Event.ENTER_FRAME,iterateSort);
}
私有函数iterateSort():void
{
var-time:int=getTimer()+每帧目标毫秒数;
var isFinished:Boolean=false;
而(!isFinished&&getTimer()
如果您需要超快速排序,那么不使用数组而使用链表可能是值得的。每种方法都有不同的优点。首先,对于链表,索引访问速度很慢,而遍历链表的速度很快,而且链表不是AS3所固有的,因此您必须自己滚动

从好的方面来说,您可以使用Polygol实验室的一些代码:

对于带有链表的几乎已排序的数据,排序非常非常快,正如本文所讨论的:

这个解决方案会给你更多的工作,但最终也会给你更多的排序速度

希望这有帮助

--附加的--

我在另一个答案的评论中注意到了你的问题,“但是有一个问题没有答案——如何在Flash中执行贪婪的计算而不挂起它?”

对于这一点,基本上答案是在多个帧上中断计算,如下所示:

    var txt:Array = ["abcde","ab","abc","a"];
    txt.sort(sortByLength);
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 ...
}
公共函数排序():void
{
addEventListener(Event.ENTER_FRAME,iterateSort);
}
私有函数iterateSort():void
{
var-time:int=getTimer()+每帧目标毫秒数;
var isFinished:Boolean=false;
而(!isFinished&&getTimer()
我不熟悉AS3,但据我所知,它是这样工作的:调用自定义函数检查每个数组元素。每次比较2个数组元素时,参数[0]和参数[1]都是要比较的数组元素查看数组文档(),它提到排序函数应该有两个参数,我一直这样做,没有问题。我不知道它是否与这个特殊的问题有任何关系。我是AS3的新手,但据我所知,它是这样工作的:调用自定义函数来检查每个数组元素。每次比较2个数组元素时,参数[0]和参数[1]都是要比较的数组元素查看数组文档(),它提到排序函数应该有两个参数,我一直这样做,没有问题。我不知道这是否与这个问题有关。谢谢你的回复,我当然接受。然而,有一个问题没有得到回答——如何在Flash中执行贪婪的计算而不挂起它?例如,在拥有200000+成员的阵列上,函数将失败。如何更改应用程序逻辑以避免闪存