Гость
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Парсер выражений / 12 сообщений из 12, страница 1 из 1
16.04.2019, 21:13
    #39802395
sergq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер выражений
Здравствуйте.


Сварганил тут вычислятор выражений. На основе дерева. Аргументы хранит в tbytes в своей ноде. Результаты тоже. Нода — соответствующий класс.Типы правых—левых аргументов определяет. Аргументы берет из tbytes через конструкцию типа Pinteger(buffer)^. Вроде работает.

Тут решил проверить скорость данной поделки. На выражении типа 5+6*5—4*7 выдает где то в районе 6 тысяч выражений. Вот только сейчас запамятовал в секунду или в милисекунду. Вроде как быстро.

А потом нашел исходники нормального парсера и вычислятора. Он тоже своего рода дерево строит. Но потом компилирует ассемблерный код. Запустил такой же тест на чуть более сложное выражение. Результат плавает в районе 100 тысяч выражений. Опять же не помню уже в секунду или мили. Но разница видна.

Собственно вопрос. А что так медленно работает первый вариант? Неужели все изза обхода дерева? Хотя там только вызовы идут в основном.
...
Рейтинг: 0 / 0
16.04.2019, 23:06
    #39802409
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер выражений
Есть надежда увидеть твой исходный код?
...
Рейтинг: 0 / 0
17.04.2019, 01:18
    #39802418
sergq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер выражений
maytonЕсть надежда увидеть твой исходный код?

Да нет там ничего «выдающегося». Базовый класс TIdentObject. От него наследуются переменные. Там все просто. Плюс от него ж наследуются классы операторов. У них есть проперти left и right. Соответствующего класса.

А вычисления примерно так

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Procedure tx.calc;
Begin 
   Self.left.calc;
   Self.right.calc;
   MakeRes; 

End;

Procedure tx.makeres;
Begin
      pinteger(resbuffer)^:=pinteger(self.left.resbuffer)^+pinteger(self.right.resbuffer)^;
End;



Makeres настраивается на этапе разбора в зависимости от типа левого и правого аргумента.
Через подобное
Код: pascal
1.
type Tmakeres= function (...);



Собственно и все. Если left или right - переменная, то calc по сути ничего не делает. Тк переменная уже лежит в resbuffer как есть. Ну а если left или right очередная операция— на том уровне так же считаются левый и правый аргументы.

В общем стандартное дерево
...
Рейтинг: 0 / 0
17.04.2019, 08:09
    #39802452
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер выражений
Ты же самое главное не написал. Где парсер? Где бенчмаркинг которым ты заменял время?
...
Рейтинг: 0 / 0
17.04.2019, 08:40
    #39802461
полудух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер выражений
maytonТы же самое главное не написал. Где парсер? Где бенчмаркинг которым ты заменял время?
развивайте свой телепатический скилл
21й век на дворе!
...
Рейтинг: 0 / 0
17.04.2019, 09:02
    #39802473
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер выражений
Кроме деревьев есть Обратная польская запись . Там вычисление идет за счет использования стэка. Думаю это побыстрее чем построение и обход дерева.
...
Рейтинг: 0 / 0
17.04.2019, 09:32
    #39802497
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер выражений
Непонятно зачем автор этот топик создал. Информацию из него - клещами тянуть надо.
И кроме того сам же говорил дескыть - взял другой парсер на ассемблере.... Потом условия
поменял. Всё перепутал. Запамятовал пишет.

Вобщем в топике мы обсуждаем сравнение частично опубликованного исходнка №1 и неизвестного
исходника. А также сочувственно киваем. Дескыть да...

Бывают случаи, друг Горацио.
...
Рейтинг: 0 / 0
17.04.2019, 17:05
    #39802969
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер выражений
maytonНепонятно зачем автор этот топик создал. Информацию из него - клещами тянуть надо.
И кроме того сам же говорил дескыть - взял другой парсер на ассемблере.... Потом условия
поменял. Всё перепутал. Запамятовал пишет.

Вобщем в топике мы обсуждаем сравнение частично опубликованного исходнка №1 и неизвестного
исходника. А также сочувственно киваем. Дескыть да...

Бывают случаи, друг Горацио.

усугубляет, цену набивает, видно платный продукт
...
Рейтинг: 0 / 0
17.04.2019, 18:59
    #39803016
sergq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер выражений
maytonТы же самое главное не написал. Где парсер? Где бенчмаркинг которым ты заменял время?

Эм. Как таковой парсер тут вообще не при чем. В тестах не считалось время как такового парсинга. Только вычислений. Как «устроены» вычисления выше обозначено. Смысла не вижу выкладывать все. Ибо там все однотипно тому, что обозначено выше.

Бенчмарки? Да простой бенчмарк. Tstopwatch и цикл на миллион вычислений выражения.

Зы. Временами вопросы меня в тупик ставят) выложена часть кода. Все остальное однотипно, до все рьяно просят выложить весь код. Недопонимаю зачем)
...
Рейтинг: 0 / 0
17.04.2019, 19:13
    #39803019
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер выражений
sergq, давай я процитирую твой вопрос.

А что так медленно работает первый вариант? Неужели все изза обхода дерева? Хотя там только вызовы идут в основном.
А теперь давай поменяемся ролями. Представь что я задал этот вопрос а ты отвечаешь?
...
Рейтинг: 0 / 0
17.04.2019, 19:58
    #39803030
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер выражений
sergqСмысла не вижу выкладывать все. Ибо там все однотипно тому, что обозначено выше.
Сколько раз память выделяется из кучи? Сделай чтобы было 0 раз и сравни производительность. Это для начала.
...
Рейтинг: 0 / 0
17.04.2019, 20:29
    #39803046
WebSharper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер выражений
sergqСобственно вопрос. А что так медленно работает первый вариант? Неужели все изза обхода дерева? Хотя там только вызовы идут в основном.

Потому, что он делает то же самое что и второй + еще кучу работы. Попробуйте его дизассемблировать пройтись step-by-step в каком-нибудь windbg - там вместо add ax, bx будет большой оверхед на вызов метода (получить адрес из VMT, сохранить состояние в стек и прочее)
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Парсер выражений / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]