powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Парсер выражений
12 сообщений из 12, страница 1 из 1
Парсер выражений
    #39802395
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.


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

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

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

Собственно вопрос. А что так медленно работает первый вариант? Неужели все изза обхода дерева? Хотя там только вызовы идут в основном.
...
Рейтинг: 0 / 0
Парсер выражений
    #39802409
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть надежда увидеть твой исходный код?
...
Рейтинг: 0 / 0
Парсер выражений
    #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
Парсер выражений
    #39802452
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты же самое главное не написал. Где парсер? Где бенчмаркинг которым ты заменял время?
...
Рейтинг: 0 / 0
Парсер выражений
    #39802461
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТы же самое главное не написал. Где парсер? Где бенчмаркинг которым ты заменял время?
развивайте свой телепатический скилл
21й век на дворе!
...
Рейтинг: 0 / 0
Парсер выражений
    #39802473
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроме деревьев есть Обратная польская запись . Там вычисление идет за счет использования стэка. Думаю это побыстрее чем построение и обход дерева.
...
Рейтинг: 0 / 0
Парсер выражений
    #39802497
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Непонятно зачем автор этот топик создал. Информацию из него - клещами тянуть надо.
И кроме того сам же говорил дескыть - взял другой парсер на ассемблере.... Потом условия
поменял. Всё перепутал. Запамятовал пишет.

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

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

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

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

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

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

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

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

А что так медленно работает первый вариант? Неужели все изза обхода дерева? Хотя там только вызовы идут в основном.
А теперь давай поменяемся ролями. Представь что я задал этот вопрос а ты отвечаешь?
...
Рейтинг: 0 / 0
Парсер выражений
    #39803030
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergqСмысла не вижу выкладывать все. Ибо там все однотипно тому, что обозначено выше.
Сколько раз память выделяется из кучи? Сделай чтобы было 0 раз и сравни производительность. Это для начала.
...
Рейтинг: 0 / 0
Парсер выражений
    #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]