Получил очередные 10% производительности.
Что странно каждая оптимизация разгоняет парсер на ~10%...
Так же сделал поддержку полноценных FSM. Теперь в FSM закатывается не только ? но и * и +. Однако прироста производительности это не дало.
Нужно еще минимизацию FSM сделать. Это должно дать еще немножко прироста и уменьшить размер генерируемого кода.
Например сейчас генерируется вот такой код:
private __GENERATED_PEG__RULE__decimalIntegerLiteral__(pos : int, text : string) : int
{
unchecked
{
mutable (c : char);
_ = c;
{
def pos =
{
mutable okPos = -1;
mutable curPos = pos;
l0:
DEFAULT;
when (curPos >= text.Length) goto l5 [1];;
c = text[curPos];
++curPos;
when ('0' <= c && c <= '9') goto l1 [1];;
goto l5 [1];;
l1:
DEFAULT;
okPos = curPos;
when (curPos >= text.Length) goto l5 [1];;
c = text[curPos];
++curPos;
when ('0' <= c && c <= '9') goto l2 [1];;
goto l5 [1];;
l2:
DEFAULT;
okPos = curPos;
when (curPos >= text.Length) goto l5 [1];;
c = text[curPos];
++curPos;
when ('0' <= c && c <= '9') goto l2 [1];;
goto l5 [1];;
l4:
DEFAULT;
okPos = curPos;
l5:
DEFAULT;
okPos
};
if (pos >= 0)
{
def newPos =
{
__GENERATED_PEG__RULE__integerTypeSuffix__(pos, text)
};
if (newPos >= 0)
{
();
newPos
}; else
{
();
pos
}
}; else -1
}
}
}
Состояния l1 и l2 будут объеденены при минимизации ДКА. Тут мы получим только уменьшение кода. Но есть случаи (там кода много по этому не показываю) когда должен быть некоторый прирост производительности.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>