2008-04-18

AS3 亂數排序的效能

利用三種方式來實作亂數排序的功能, 並比較效能
A. 製作 Array.sort() 的排序函式
B. 大風吹, 兩兩隨機交換位置
C. 使用 splice() 隨機一個個切出來
結果 B 效能最佳:
A: 2116
B: 66
C: 3828

Flash Frame Actions:
/*
*******
A. 配合 Array.sort() 使用
*******
*/
function shuffle_1(...args):int
{
return Math.floor(3 * Math.random()) - 1;
}
/*
*******
B. 大風吹, 隨機交換位置
*******
*/
function shuffle_2(ar:Array):void
{
var rnd:int;
var tmp:Object;
for (var i:int=0; i < ar.length; i++) {
rnd = Math.floor(Math.random()*ar.length);
tmp = ar[i];
ar[i] = ar[rnd];
ar[rnd] = tmp;
}
}
/*
*******
C. 隨機一個一個取出, 推入新陣列
*******
*/
function shuffle_3(ar:Array):Array
{
var br:Array = [];
var rnd:int;
var cr:Array;
while (ar.length)
{
rnd = Math.floor(Math.random()*ar.length);
//cr = ar.splice(rnd, 1);
br.push( ar.splice(rnd, 1)[0] );

}
return br;
}
/*****************************************/
var ar:Array = [];
for (var i:int=0; i < 100000; i++) {
ar.push(i);
}

var t:int = getTimer();
ar.sort(shuffle_1);
trace("A: "+ (getTimer()-t) );

t = getTimer();
shuffle_2(ar);
trace("B: "+ (getTimer()-t) );

t = getTimer();
ar = shuffle_3(ar);
trace("C: "+ (getTimer()-t) );

1 則留言:

阿宏 提到...

剛用效能最差的方法~
寫過ㄧ個亂數取資料~
結果現在看到這個....

這是....天意...囧!

FB 留言