Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Dukobpa3

Оценить эту запись

Маленький воркбенч по скорости доступа к данным

Запись от Dukobpa3 размещена 02.06.2011 в 14:52
Обновил(-а) Dukobpa3 03.06.2011 в 01:00

Вчера была дискуссия с коллегой на тему как быстрее. Дабы долго не спорить написал вот такую маленькую штуковинку.

Дискуссия была вокруг того парсить ли джейсон в свои типы данных или можно юзать просто декодированный объект.

Для зубров наверное будет не очень интересно, а вот начинающим выводы можно сделать.

Результаты:
Код AS3:
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 - это готовый ФД проект воркбенча
А это кому просто посмотреть.
Код AS3:
//*********************
// 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 etc вне форума
etc
 
Аватар для etc
А мы явно не любим пользоваться ссылками и копипастим _state[item.level] 100500 раз.
Старый 02.06.2011 18:03 alatar вне форума
alatar
 
Аватар для alatar
Динамические объекты заведомо более медленные. http://jacksondunstan.com/articles/1139
Старый 02.06.2011 18:41 Dukobpa3 вне форума
Dukobpa3
 
Аватар для Dukobpa3
@etc ну стопицот и 4 - разные весчи, как для меня

@alatar - ну как бы да, но хотелось увидеть цифры именно в аналогичном (практически идентичном использовании), чего я и добился для себя. А за ссылку спасибо.
 

 


Часовой пояс GMT +4, время: 20:11.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.