
Код 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 {
testNubideus();//testNubideus:27352
testMikroAcse();//testMikroAcse:33144
testSlavaRa();//testSlavaRa:23775
testNooob();//testNooob:26051
}
private var _field:TextField;
private function testNubideus():void {
var arr:Array = ["Юзернейм", "4", "года", "завтрашний", "только лишь все"];
var stamp:int = getTimer();
for (var j:int = 0; j < COUNT; j++) {
var str:String = "Привет %s, тебе сегодня исполнилось %d %s. Сегодня в %s день могут смотреть не %s. Не скучай, %s!";
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 stamp:int = getTimer();
for (var j:int = 0; j < COUNT; j++) {
var str:String = "Привет {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]);
}
}
_field.appendText("\ntestMikroAcse:" + (getTimer() - stamp));
}
private function testSlavaRa():void {
var args:Vector.<String> = new <String>["Юзернейм", "4", "года", "завтрашний", "только лишь все"];
var stamp:int = getTimer();
for (var j:int = 0; j < COUNT; j++) {
var str:String = "Привет {0}, тебе сегодня исполнилось {1} {2}. Сегодня в {3} день могут смотреть не {4}. Не скучай, {0}!";
str = StringTool.format(str, args);
}
_field.appendText("\ntestSlavaRa:" + (getTimer() - stamp));
}
private function testNooob():void {
var stamp:int = getTimer();
for (var j:int = 0; j < COUNT; j++) {
var str:String = "Привет {0}, тебе сегодня исполнилось {1} {2}. Сегодня в {3} день могут смотреть не {4}. Не скучай, {0}!";
str = StringUtils.format(str, "Юзернейм", "4", "года", "завтрашний", "только лишь все");
}
_field.appendText("\ntestNooob:" + (getTimer() - stamp));
}
}
}
class StringTool {
[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;
}
}
class StringUtils
{
private static const regExp:RegExp = /{(\w)}/g;
private static var repl:Array;
public static function format(source:String, ...args):String
{
repl = args;
return source.replace(regExp, replaceFunc);
}
private static function replaceFunc(substr:String, group:int, i:uint, str:String):String
{
return repl[group];
}
}