自定义排序功能瓶颈
我尝试使用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插件崩溃?
尝试尽可能使用强类型,这里告诉你的函数你正在等待两个字符串。
你可以重写你的函数有两种方式一个最快的比,如果你知道,所有的元素都不能为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
}
sortByLength
应该有两个参数,不应该吗?我想这就是你在arguments
阵列的意思......
这看起来好像没什么问题,除非arguments
不是一个局部变量,而是一个成员变量,你只是在其[0]
和[1]
元素看好每个函数调用。那至少会产生不希望的结果。
我新的AS3,但据我所知它的工作方式是:自定义函数被调用检查每个数组元素每次比较两个数组元素,所以参数[0]和参数[1]是正在比较的数组元素 – Termos 2011-06-06 16:45:27
查看Array文档(http://help.adobe.com/zh_CN/FlashPlatform/reference /actionscript/3/Array.html#sort()),它提到sort函数应该有两个参数,而且我一直这样做没有问题,我不知道这与它有什么关系特别的问题虽然 – 2011-06-06 16:49:11
如果您需要超快速排序,那么它可能是值得不使用数组所有,而是使用链表。每个人都有不同的优点。首先,链接列表的索引访问速度很慢,而遍历列表的速度很快,并且链接列表不是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 ...
}
定位长度查找是O(n)和缩放线性,因为链接列表通常不会缓存长度 - 尽管似乎多边形确实尽力尝试并保持同步。所以如果他有20000多个元素,他需要从0到20000个元素去寻找长度。 – simonrichardson 2011-07-12 15:20:20
看起来不错,但我认为这不应该更快。 – Eugeny89 2011-06-06 17:15:46
谢谢你的回复,我当然接受它。但是有一个问题没有答案 - 如何在Flash中执行贪婪的计算而不挂上它?例如,你的函数在具有200000+个成员的数组上失败。如何更改应用程序逻辑以避免CPU密集型任务期间Flash插件崩溃(如排序大数组)? – Termos 2011-06-06 17:16:59
@ Eugeny89不要猜测,但尝试;)它会更快的工作,因为:你消除了参数[]的指针数组访问,你消除了代价昂贵的分支。现在,如果您使用不太多的数据进行测试,您将看不到差异。 – Patrick 2011-06-06 17:33:43