Re[5]: PEG-парсер
От: WolfHound  
Дата: 18.03.10 19:24
Оценка:
Здравствуйте, 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>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.