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>