Показать сообщение отдельно
Старый 06.09.2014, 22:58
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 17  
Ответить с цитированием
Nooob
 
Аватар для Nooob

Регистрация: Mar 2007
Сообщений: 319
ну ещёб, у тебя там ошибки в коде, в следующей итерации str будет уже старый и поэтому будет работать быстрее.
если уж инлайнить то
Код AS3:
package
{
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.utils.getTimer;
	import flash.utils.setTimeout;
 
	/**
	 * @author SlavaRa
	 */
	public class Main extends Sprite
	{
		public static const COUNT:int = 1000000;
 
		public function Main ()
		{
			super();
			_field = new TextField();
			_field.width = 800;
			_field.height = 600;
			addChild(_field);
			setTimeout(runTests, 1000);
		}
 
		private function runTests ():void
		{
			testNubideus(); //testNubideus:7695
			testMikroAcse(); //testMikroAcse:10034
			testSlavaRa(); //testSlavaRa:7824
			testNooob(); //testNooob:7493
		}
 
		private var _field:TextField;
 
		private function testNubideus ():void
		{
			var str:String    = "Привет %s, тебе сегодня исполнилось %d %s. Сегодня в %s день могут смотреть не %s. Не скучай, {0}!";
			var func:Function = function (substr:String, i:uint, str:String):String {
				switch (substr) {
					case "%s": {return arr.shift();}
					case "%d": {return arr.shift();}
				}
			};
			var regexp:RegExp = /%s|%d/g;
			var stamp:int     = getTimer();
			for (var j:int = 0; j < COUNT; j++)
			{
				var arr:Array     = ["Юзернейм", "4", "года", "завтрашний", "только лишь все"];
				var result:String = str.replace(regexp, func);
			}
			_field.appendText("\ntestNubideus:" + (getTimer() - stamp));
		}
 
		private function testMikroAcse ():void
		{
			var arr:Array  = ["Юзернейм", "4", "года", "завтрашний", "только лишь все"];
			var str:String = "Привет {0}, тебе сегодня исполнилось {1} {2}. Сегодня в {3} день могут смотреть не {4}. Не скучай, {0}!";
			var stamp:int  = getTimer();
			for (var j:int = 0; j < COUNT; j++)
			{
				var result:String = str;
				var len:int       = arr.length;
				for (var i:int = 0; i < len; i++)
				{
					result = result.split("{" + i + "}").join(arr[i]);
				}
			}
			_field.appendText("\ntestMikroAcse:" + (getTimer() - stamp));
		}
 
		private function testSlavaRa ():void
		{
			var args:Vector.<String> = new <String>["Юзернейм", "4", "года", "завтрашний", "только лишь все"];
			var str:String           = "Привет {0}, тебе сегодня исполнилось {1} {2}. Сегодня в {3} день могут смотреть не {4}. Не скучай, {0}!";
			var stamp:int            = getTimer();
			for (var j:int = 0; j < COUNT; j++)
			{
				var result:String = str;
				var length:int    = args.length;
				for (var i:int = 0; i < length; i++)
				{
					var pattern:String = "{" + i + "}";
					while (result.indexOf(pattern) != -1)
					{
						result = result.replace(pattern, args[i]);
					}
				}
			}
			_field.appendText("\ntestSlavaRa:" + (getTimer() - stamp));
		}
 
		private function testNooob ():void
		{
			var args:Vector.<String> = new <String>["Юзернейм", "4", "года", "завтрашний", "только лишь все"];
			var str:String           = "Привет {0}, тебе сегодня исполнилось {1} {2}. Сегодня в {3} день могут смотреть не {4}. Не скучай, {0}!";
			var regExp:RegExp        = /{(\w)}/g;
			var replaceFunc:Function = function (substr:String, group:int, i:uint, str:String):String
			{
				return args[group];
			}
 
			var stamp:int            = getTimer();
			for (var j:int = 0; j < COUNT; j++)
			{
				var result:String = str.replace(regExp, replaceFunc);
			}
			_field.appendText("\ntestNooob:" + (getTimer() - stamp));
		}
	}
}