Маленький воркбенч по скорости доступа к данным
Вчера была дискуссия с коллегой на тему как быстрее. Дабы долго не спорить написал вот такую маленькую штуковинку.
Дискуссия была вокруг того парсить ли джейсон в свои типы данных или можно юзать просто декодированный объект.
Для зубров наверное будет не очень интересно, а вот начинающим выводы можно сделать.
Результаты:
nonParsedAccessor: 3135 // return _data.state[0].state_sub[0].effect.energy.percent; parsedAccessor: 1803 // return _some; nonParsedMasterAccessor: 27259 // var arr:Array = data.state; // return arr.filter(function(item:*, index:int, array:Array):Boolean { // if (item.level == level) return true; // return false; // })[0].progress; parsedMasterAccessor: 2185 // return _state[level].progress;
Вывод из этого всего такой: парсить надо, и делать вложенность поменьше.
Исходник
TestParsing.rar - это готовый ФД проект воркбенча
А это кому просто посмотреть.
//********************* // nonParsedItem //********************* package { /** * ... * @author Dukobpa3 */ public class NonParsedItem { //============================= // PRIVATE //============================= private var _data:Object //============================= // CONSTRUCTOR, INIT //============================= public function NonParsedItem() { } //============================= // ACCESSORS //============================= public function get some():int { return _data.state[0].state_sub[0].effect.energy.percent; } public function getProgressByLevel(level:int):int { var arr:Array = data.state; return arr.filter(function(item:*, index:int, array:Array):Boolean { if (item.level == level) return true; return false; } )[0].progress; } public function get data():Object { return _data; } public function set data(value:Object):void { _data = value; } } } //********************* // parsedItem //********************* package { import flash.utils.Dictionary; /** * ... * @author Dukobpa3 */ public class ParsedItem { //============================= // PRIVATE //============================= private var _some:int private var _state:Dictionary; //============================= // CONSTRUCTOR, INIT //============================= public function ParsedItem() { } //============================= // PUBLIC //============================= public function parse(data:Object):void { _some = data.state[0].state_sub[0].effect.energy.percent; _state = new Dictionary(); for each(var item:Object in data.state) { _state[item.level] = new Object(); _state[item.level].building = { "1": item.building[1], "2": item.building[2] } _state[item.level].lock = item.lock _state[item.level].progress = item.progress } } //============================= // ACCESSORS //============================= public function get some():int { return _some; } public function getProgressByLevel(level:int):int { return _state[level].progress; } } } //********************* // Main //********************* package { import com.adobe.serialization.json.JSON; import flash.display.Sprite; import flash.events.Event; import flash.net.URLLoader; import flash.net.URLLoaderDataFormat; import flash.net.URLRequest; import flash.utils.getTimer; /** * ... * @author Dukobpa3 */ public class Main extends Sprite { private var req:URLRequest = new URLRequest("json/json.txt"); private var loader:URLLoader = new URLLoader(); private var parsedArr:Array = []; private var nonParsedArr:Array = []; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point loader.dataFormat = URLLoaderDataFormat.TEXT; loader.addEventListener(Event.COMPLETE, onLoadComplete) loader.load(req) } private function onLoadComplete(event:Event):void { // removeEventListener(Event, onLoadComplete); var obj:Object = JSON.decode(event.target.data); parseObj(obj); } private function parseObj(obj:Object):void { for each (var item:Object in obj.table) { var parsedObj:ParsedItem = new ParsedItem(); parsedObj.parse(item); parsedArr.push(parsedObj); var nonParsedObj:NonParsedItem = new NonParsedItem(); nonParsedObj.data = item; nonParsedArr.push(nonParsedObj); } var i:int; var num:Number; var t:Number; t = getTimer(); for (i = 0 ; i < 100000 ; i ++ ) { for each (nonParsedObj in nonParsedArr) { num = nonParsedObj.some } } trace('nonParsedAccessor: ' + ( getTimer() - t )); t = getTimer(); for (i = 0 ; i < 100000 ; i ++ ) { for each (parsedObj in parsedArr) { num = parsedObj.some } } trace('parsedAccessor: ' + ( getTimer() - t )); t = getTimer(); for (i = 0 ; i < 100000 ; i ++ ) { for each (nonParsedObj in nonParsedArr) { num = nonParsedObj.getProgressByLevel(1) } } trace('nonParsedMasterAccessor: ' + ( getTimer() - t )); t = getTimer(); for (i = 0 ; i < 100000 ; i ++ ) { for each (parsedObj in parsedArr) { num = parsedObj.getProgressByLevel(1) } } trace('parsedMasterAccessor: ' + ( getTimer() - t )); } } }
Всего комментариев 3
Комментарии
02.06.2011 17:33 | |
А мы явно не любим пользоваться ссылками и копипастим _state[item.level] 100500 раз.
|
02.06.2011 18:03 | |
Динамические объекты заведомо более медленные. http://jacksondunstan.com/articles/1139
|
Последние записи от Dukobpa3
- Strategy (Стратегия) (27.12.2013)
- State (Состояние) (27.12.2013)
- State-machine (конечный автомат, машина состояний) (25.12.2013)
- Медиатор, Прокси (14.11.2013)
- Инкапсуляция объекта vs инкапсуляция поведения (14.11.2013)