| nubideus |
09.09.2014 00:55 |
x100000
Цитата:
testNubideus:3256
Ехал Грека через реку, видит Грека в реке рак, сунул Грека в реку руку, рак за руку Греку цап!! {q} {0} {} {
testMikroAcse:5090
Ехал Грека через реку, видит Грека в реке рак, сунул Грека в реку руку, рак за руку Греку цап!! {q} {{14}} {}
testSlavaRa:8296
Ехал Грека через реку, видит Грека в реке рак, сунул Грека в реку руку, рак за руку Греку цап!! {q} Ехал {} {
testNooob:3643
Ехал Грека через реку, видит Грека в реке рак, сунул Грека в реку руку, рак за руку Греку цап!! {q} {0} {}
|
Код 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 arr:Vector.<String> = new <String>["Ехал", "Грек", "а", "через", "рек", "у", "видит", "в", "е", "рак", "сунул", "руку", "за", "цап", "0"];
public static const str:String = "{0} {1}{2} {3} {4}{5}, {6} {1}{2} {7} {4}{8} {9}, {10} {1}{2} {7} {4}{5} {11}, {9} {12} {11} {1}{5} {13}!! {q} {{14}} {} {";
public static const COUNT:int = 100000;
public function Main ()
{
super();
_field = new TextField();
_field.width = 800;
_field.height = 600;
addChild(_field);
setTimeout(runTests, 1000);
}
private function runTests ():void
{
testNubideus();
testMikroAcse();
testSlavaRa();
testNooob();
}
private var _field:TextField;
private function testNubideus ():void
{
var stamp:int = getTimer();
for (var j:int = 0; j < COUNT; j++)
{
var result:String = "";
var openIndex:uint = 0;
var closeIndex:uint = 0;
var i:uint = 0;
parse: while (true) {
openIndex = str.indexOf("{", i) + 1;
if (openIndex) {
var index:uint = 0;
for (i = openIndex; ; i++ ) {
var code:uint = str.charCodeAt(i);
//if ((code + 2147483551 | 0) >= 2147483599) {
if (code >= 48 && code <= 57) {
index = index * 10 + (code - 48);
continue;
}else if (code === 125) { // if "}"
break;
}
continue parse;
}
if (openIndex < i) {
result += str.substring(closeIndex, openIndex - 1) + arr[index];
closeIndex = i + 1;
}
continue;
}
result += str.substring(closeIndex, str.length);
break;
}
}
_field.appendText("\ntestNubideus:" + (getTimer() - stamp));
_field.appendText("\n" + result);
}
private function testMikroAcse ():void
{
var stamp:int = getTimer();
for (var j1:int = 0; j1 < COUNT; j1++)
{
var res:String = "";
var current:String;
var nesting:int = 0;
for (var j:int = 0, l:int = str.length; j < l; j++)
{
var char:String = str.charAt(j);
if (char == '{') {
if (nesting == 0) {
current = "";
} else {
current += '{';
}
nesting++;
continue;
}
if (char == '}') {
if (nesting == 1) {
var parsed:Number = parseFloat(current);
if (isNaN(parsed)) {
res += "{" + current + "}";
} else {
res += arr[parsed];
}
} else {
current += '}';
}
nesting--;
continue;
}
if (nesting == 0) {
res += char;
} else {
current += char;
}
}
}
_field.appendText("\ntestMikroAcse:" + (getTimer() - stamp));
_field.appendText("\n" + res);
}
private function testSlavaRa ():void
{
var stamp:int = getTimer();
for (var j:int = 0; j < COUNT; j++)
{
var result:String = StringTool.format(str, arr);
}
_field.appendText("\ntestSlavaRa:" + (getTimer() - stamp));
_field.appendText("\n" + result);
}
private function testNooob ():void
{
var stamp:int = getTimer();
for (var j:int = 0; j < COUNT; j++)
{
var result:String = StringUtilsFast.format(str, arr);
}
_field.appendText("\ntestNooob:" + (getTimer() - stamp));
_field.appendText("\n" + result);
}
}
}
import flash.system.ApplicationDomain;
import flash.utils.ByteArray;
import avm2.intrinsics.memory.li32;
import avm2.intrinsics.memory.li8;
import avm2.intrinsics.memory.si32;
class StringUtilsFast
{
[Inline]
public static function format (source:String, args:Vector.<String>):String
{
var result:String = "";
var openIndex:int = -1;
var charCount:int = 0;
var n:int = source.length;
var a:int = args.length;
var i:int = 0;
l3: if(i < n)
{
var char:String = source.charAt(i);
if (openIndex != -1)
{
if (char == "}")
{
if(openIndex == i)
{
goto l1;
}
var argsIndex:int = 0;
var count:int = 1;
var k:int = openIndex;
l2:if (k < i)
{
var code:uint = source.charCodeAt(k);
if (code >= 48 && code <= 57)
{
argsIndex = argsIndex * count + (code - 48);
count *= 10;
k++;
goto l2;
}
goto l1;
}
if (argsIndex < a)
{
result += source.substr(openIndex - charCount - 1, charCount);
charCount = 0;
result += args[argsIndex];
openIndex = -1;
i++;
goto l3;
}
l1:
result += source.substring(openIndex - charCount - 1, i + 1);
charCount = 0;
openIndex = -1;
i++;
goto l3;
}
if (char == "{")
{
result += source.substring(openIndex - charCount - 1, i);
charCount = 0;
openIndex = i + 1;
i++;
goto l3;
}
i++;
goto l3;
}
if (char == "{")
{
openIndex = i + 1;
i++;
goto l3;
}
charCount++;
i++;
goto l3;
}
return result;
}
}
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;
}
}
Цитата:
Я вот только не понимаю, какие то адские различия между дебаг и релиз плеером
|
там после каждого переноса строки добавляются байты отладки, т.е. так получается потому что у тебя просто строк больше в коде. ну и мб charAt медленнее в дебаге
идею бессовестно урал, зато нашел баг.
допустим строка 123:
0 * 1 + 1
1 * 10 + 2
12 * 100 + 3
= 1203
можно просто умножать на 10:
0 * 10 + 1
1 * 10 + 2
12 * 10 + 3
= 123
кстати у тебя последняя открытая скобка игнорится
|