Здравствуйте, para, Вы писали:
P>неужели было на много лучше?
P>P>if (pos < 0)
P> $(CapturesName : dyn).RemoveRange(captureId, $(CapturesName : dyn).Count - captureId); //SCG.List[]
P>
Именно так.
Этот вариант не страдает квадратичной сложностью и в отличии от твоего создает почти нулевую нагрузку на сборщик мусора.
Но и этот вариант соверенно не пригоден для реальной работы.
Если не веришь в то что твой код имеет квадратичную сложность запусти вот этот тест и убедись сам:
mutable suffix = "+1";
for (mutable n = 1; n < 8; ++n)
{
suffix += suffix;
}
mutable text = "0";
for (mutable n = 1; n < 20; ++n)
{
text += suffix;
WriteLine($"text length is:$(text.Length)");
def timer = Diagnostics.Stopwatch.StartNew();
def calc = CalcParser(text);
def pos = calc.ParsedSymbolsCount;
def res = calc.Result;
timer.Stop();
WriteLine($"$pos Parse took $(timer.Elapsed) $(Math.Sqrt(timer.Elapsed.TotalMilliseconds) / text.Length)");
WriteLine($"result is: $res");
WriteLine();
}
P>если Вы так крут,
Ой какие мы обидчивые.
P>то расскажите пожалуйста как сделать это правильно?
P>добавлять в начало списка?
Выкинуть список. Совсем.
Единственно верный вариант это завести локальные переменные прямо в генерируемом коде для заинлайненых правил, а для тех правил что нельзя инлайнить нужно возвращать данные через ref параметер функции(кортежи они конечно красивее но тормозят).
... << RSDN@Home 1.2.0 alpha 4 rev. 1305>>