DataSorter
DataSorterなるものを発見した。
Flextras: Flex Components that Save Flex Developers Time!
Flexの標準部品だと、Sort処理は以下のように実装しなければいけないが
var srt:Sort = new Sort(); var flds:Array = new Array(new SortField("value")); srt.fields = flds; list.sort = srt; list.refresh();
このDataSorterを使うと、以下のように簡単に実装できる。
var sorter:DataSorter = new DataSorter(); sorter.dataProvider = list; //listにはソート対象の配列が入っている。 sorter.orderingField = "value"; //ソート対象フィールドを指定 sorter.sort();
確かに、これはお手軽、と思ったが、性能が悪い。
30レコード DataSorter:27ms 標準:0ms
100レコード DataSorter:42ms 標準:0ms
1000レコード DataSorter:2224ms 標準:1ms
5000レコード DataSorter:51671ms 標準:2ms
すごい差。
Adobe、侮り難し。
尚、今回試したソース全量は以下の通り。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"> <!-- 測定結果 30レコード DataSorter:27ms 標準:0ms 100レコード DataSorter:42ms 標準:0ms 1000レコード DataSorter:2224ms 標準:1ms 5000レコード DataSorter:51671ms 標準:2ms --> <mx:Script> <![CDATA[ import mx.collections.SortField; import mx.collections.Sort; import mx.events.CollectionEvent; import flash.utils.getTimer; import com.flextras.dataSorter.DataSorter; import mx.collections.ArrayCollection; private var list:ArrayCollection = new ArrayCollection(); private var list2:ArrayCollection = new ArrayCollection(); private function init():void { var cnt:int = 5000; for(var i:int=0; i<cnt; i++) { var rec:Object = new Object(); rec.value = Math.round(Math.random() * cnt); rec.id = i; list.addItem(rec); list2.addItem(rec); //beforeTxa.text += "{ id:" + rec.id + ", value:" + rec.value + "}\n"; } } private function sortExecute():void { var sorter:DataSorter = new DataSorter(); sorter.dataProvider = list; //listにはソート対象の配列が入っている。 var start:int = getTimer(); sorter.orderingField = "value"; //ソート対象フィールドを指定 sorter.sort(); var end:int = getTimer(); for(var i:int=0; i<list.length; i++) { //afterTxa.text += "{ id:" + list.getItemAt(i).id + ", value:" + list.getItemAt(i).value + "}\n"; } afterTxa.text += ( end - start ) + "ms spend"; afterTxa.text += "\n\n\n"; var start2:int = getTimer(); var srt:Sort = new Sort(); var flds:Array = new Array(new SortField("value")); srt.fields = flds; list2.sort = srt; list2.refresh(); var end2:int = getTimer(); for(var i:int=0; i<list.length; i++) { //afterTxa.text += "{ id:" + list2.getItemAt(i).id + ", value:" + list2.getItemAt(i).value + "}\n"; } afterTxa.text += ( end2 - start2 ) + "ms spend"; } ]]> </mx:Script> <mx:HBox width="100%" height="100%"> <mx:TextArea id="beforeTxa" width="50%" height="100%"/> <mx:Button id="exeBtn" label="Sort →" click="sortExecute()"/> <mx:TextArea id="afterTxa" width="50%" height="100%"/> </mx:HBox> </mx:Application>