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

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
Небольшой тестик по теме
Код AS3:
package {
	import flash.display.Sprite;
	import flash.events.Event;
	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 {
			//var str:String;
			//var arr:Array;
			//arr = ["Юзернейм", "4", "года", "завтрашний", "только лишь все"];
			//str = "Привет %s, тебе сегодня исполнилось %d %s. Сегодня в %s день могут смотреть не %s.";
			//trace(str.replace(/%s|%d/g, function(substr:String, i:uint, str:String):String {
				//switch(substr) {
					//case "%s": return arr.shift();
					//case "%d": return arr.shift();
				//}
			//}));//Привет Юзернейм, тебе сегодня исполнилось 4 года. Сегодня в завтрашний день могут смотреть не только лишь все.
			//arr = ["Юзернейм", "4", "года", "завтрашний", "только лишь все"];
			//str = "Привет {0}, тебе сегодня исполнилось {1} {2}. Сегодня в {3} день могут смотреть не {4}. Не скучай, {0}!";
			//var len:int = arr.length;
			//for(var i:int = 0; i < len; i++) {
				//str = str.split("{" + i + "}").join(arr[i]);
			//}
			//trace(str);
			//Привет Юзернейм, тебе сегодня исполнилось 4 года. Сегодня в завтрашний день могут смотреть не только лишь все. Не скучай, Юзернейм!
			//var args:Vector.<String> = new <String>["Юзернейм", "4", "года", "завтрашний", "только лишь все"];
			//str = "Привет {0}, тебе сегодня исполнилось {1} {2}. Сегодня в {3} день могут смотреть не {4}. Не скучай, {0}!";
			//var length:int = args.length;
			//for(var i:int = 0; i < length; i++) {
				//var pattern:String = "{" + i + "}";
				//while(str.indexOf(pattern) != -1) {
					//str = str.replace(pattern, args[i]);
				//}
			//}
			//trace(str);
			//Привет Юзернейм, тебе сегодня исполнилось 4 года. Сегодня в завтрашний день могут смотреть не только лишь все. Не скучай, Юзернейм!
			testNubideus();//testNubideus:13652
			testMikroAcse();//testMikroAcse:9039
			testSlavaRa();//testSlavaRa:3495
		}
 
		private var _field:TextField;
 
		private function testNubideus():void {
			var arr:Array = ["Юзернейм", "4", "года", "завтрашний", "только лишь все"];
			var str:String = "Привет %s, тебе сегодня исполнилось %d %s. Сегодня в %s день могут смотреть не %s. Не скучай, {0}!";
			var stamp:int = getTimer();
			for (var j:int = 0; j < COUNT; j++) {
				str.replace(/%s|%d/g, function(substr:String, i:uint, str:String):String {
					switch(substr) {
						case "%s": return arr.shift();
						case "%d": return arr.shift();
					}
				});
			}
			_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 len:int = arr.length;
				for(var i:int = 0; i < len; i++) {
					str = str.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 length:int = args.length;
				for(var i:int = 0; i < length; i++) {
					var pattern:String = "{" + i + "}";
					while(str.indexOf(pattern) != -1) {
						str = str.replace(pattern, args[i]);
					}
				}
			}
			_field.appendText("\ntestSlavaRa:" + (getTimer() - stamp));
		}
	}
}
из теста видно, код от Nubideus выполняется с ошибкой(по-моему где-то я такое видел)

UPD1:
самый быстрый Inline вариант, стабильно 4 сек. на миллион
Код AS3:
[Inline]
public static function format(source:String, args:Vector.<String>):String {
	for(var i:int = args.length; --i >= 0; ) {
		var pattern:String = "{" + i + "}";
		label: if(source.indexOf(pattern) != -1) {
			source = source.replace(pattern, args[i])
			goto label;
		}
	}
	return source;
}
__________________
местонахождение


Последний раз редактировалось СлаваRa; 06.09.2014 в 23:11.