Array.RETURNINDEXEDARRAYってどうよ?(Vector.sortも追加した)
[実験] Array.RETURNINDEXEDARRAYってどうよ?(Vectorも追加)
手持ちの環境では Array.RETURNINDEXEDARRAY を使わない方が速い。
要素を交換する方が速いのは意外。
修正:Vector.sortの比較関数を変更、かなり速くなりました。
/**
* Copyright alumican_net ( http://wonderfl.net/user/alumican_net )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/gTSx
*/
// [実験] Array.RETURNINDEXEDARRAYってどうよ?(Vectorも追加)
//
// 手持ちの環境では Array.RETURNINDEXEDARRAY を使わない方が速い。
// 要素を交換する方が速いのは意外。
//
// 修正:Vector.sortの比較関数を変更、かなり速くなりました。
package {
import flash.display.*;
import flash.text.*;
import flash.utils.*;
public class Main extends Sprite
{
private var _array1:Array;
private var _array2:Array;
private var _vector:Vector.<Number>;
private function _compare(x:Number, y:Number):Number
{
return x - y;
}
public function Main():void
{
var n:uint = 10000;
_array1 = new Array(n);
_vector = new Vector.<Number>(n);
for(var i:uint = 0; i < 10000; ++i)
{
_array1[i] = _vector[i] = Math.random();
}
_array2 = _array1.concat();
var indices:Array;
_setup();
_measure("Case 1 : Array.RETURNINDEXEDARRAY を使う", function ():void
{
indices = _array1.sort(Array.NUMERIC | Array.RETURNINDEXEDARRAY);
}, 100);
_measure("Case 2 : Array.RETURNINDEXEDARRAY を使わない", function ():void
{
_array2.sort(Array.NUMERIC);
}, 100);
_measure("Case 3 : Vector.sort(compareFunction)", function ():void
{
_vector.sort(_compare);
}, 100);
_measure("ソート後の全要素へのアクセス(Case : 1)", function ():void
{
for(var i:uint = 0; i < n; ++i)
{
_array1[indices[i]];
}
}, 100);
_measure("ソート後の全要素へのアクセス(Case : 2)", function ():void
{
for(var i:uint = 0; i < n; ++i)
{
_array1[i];
}
}, 100);
_measure("ソート後の全要素へのアクセス(Case : 3)", function ():void
{
for(var i:uint = 0; i < n; ++i)
{
_vector[i];
}
}, 100);
}
private function _measure(
title:String, func:Function, numTimes:uint, ...params):void
{
_time = getTimer();
for (var i:int = 0; i < numTimes; i++) {
func.apply(null, params);
}
_time = getTimer() - _time;
_debug("[ " + title + " ] --> " + _time + " ms");
}
private function _debug(log:String):void
{
_field.appendText(log + "\n");
}
private var _field:TextField;
private var _time:uint;
private function _setup():void
{
_field = new TextField();
_field.width = stage.stageWidth;
_field.height = stage.stageHeight;
var format:TextFormat = _field.defaultTextFormat;
format.font = "_sans";
_field.defaultTextFormat = format;
addChild(_field);
}
}
}