|
Парсер выражений
|
|||
---|---|---|---|
#18+
Здравствуйте. Сварганил тут вычислятор выражений. На основе дерева. Аргументы хранит в tbytes в своей ноде. Результаты тоже. Нода — соответствующий класс.Типы правых—левых аргументов определяет. Аргументы берет из tbytes через конструкцию типа Pinteger(buffer)^. Вроде работает. Тут решил проверить скорость данной поделки. На выражении типа 5+6*5—4*7 выдает где то в районе 6 тысяч выражений. Вот только сейчас запамятовал в секунду или в милисекунду. Вроде как быстро. А потом нашел исходники нормального парсера и вычислятора. Он тоже своего рода дерево строит. Но потом компилирует ассемблерный код. Запустил такой же тест на чуть более сложное выражение. Результат плавает в районе 100 тысяч выражений. Опять же не помню уже в секунду или мили. Но разница видна. Собственно вопрос. А что так медленно работает первый вариант? Неужели все изза обхода дерева? Хотя там только вызовы идут в основном. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2019, 21:13 |
|
Парсер выражений
|
|||
---|---|---|---|
#18+
Есть надежда увидеть твой исходный код? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2019, 23:06 |
|
Парсер выражений
|
|||
---|---|---|---|
#18+
maytonЕсть надежда увидеть твой исходный код? Да нет там ничего «выдающегося». Базовый класс TIdentObject. От него наследуются переменные. Там все просто. Плюс от него ж наследуются классы операторов. У них есть проперти left и right. Соответствующего класса. А вычисления примерно так Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Makeres настраивается на этапе разбора в зависимости от типа левого и правого аргумента. Через подобное Код: pascal 1.
Собственно и все. Если left или right - переменная, то calc по сути ничего не делает. Тк переменная уже лежит в resbuffer как есть. Ну а если left или right очередная операция— на том уровне так же считаются левый и правый аргументы. В общем стандартное дерево ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2019, 01:18 |
|
Парсер выражений
|
|||
---|---|---|---|
#18+
Ты же самое главное не написал. Где парсер? Где бенчмаркинг которым ты заменял время? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2019, 08:09 |
|
Парсер выражений
|
|||
---|---|---|---|
#18+
maytonТы же самое главное не написал. Где парсер? Где бенчмаркинг которым ты заменял время? развивайте свой телепатический скилл 21й век на дворе! ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2019, 08:40 |
|
Парсер выражений
|
|||
---|---|---|---|
#18+
Кроме деревьев есть Обратная польская запись . Там вычисление идет за счет использования стэка. Думаю это побыстрее чем построение и обход дерева. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2019, 09:02 |
|
Парсер выражений
|
|||
---|---|---|---|
#18+
Непонятно зачем автор этот топик создал. Информацию из него - клещами тянуть надо. И кроме того сам же говорил дескыть - взял другой парсер на ассемблере.... Потом условия поменял. Всё перепутал. Запамятовал пишет. Вобщем в топике мы обсуждаем сравнение частично опубликованного исходнка №1 и неизвестного исходника. А также сочувственно киваем. Дескыть да... Бывают случаи, друг Горацио. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2019, 09:32 |
|
Парсер выражений
|
|||
---|---|---|---|
#18+
maytonНепонятно зачем автор этот топик создал. Информацию из него - клещами тянуть надо. И кроме того сам же говорил дескыть - взял другой парсер на ассемблере.... Потом условия поменял. Всё перепутал. Запамятовал пишет. Вобщем в топике мы обсуждаем сравнение частично опубликованного исходнка №1 и неизвестного исходника. А также сочувственно киваем. Дескыть да... Бывают случаи, друг Горацио. усугубляет, цену набивает, видно платный продукт ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2019, 17:05 |
|
Парсер выражений
|
|||
---|---|---|---|
#18+
maytonТы же самое главное не написал. Где парсер? Где бенчмаркинг которым ты заменял время? Эм. Как таковой парсер тут вообще не при чем. В тестах не считалось время как такового парсинга. Только вычислений. Как «устроены» вычисления выше обозначено. Смысла не вижу выкладывать все. Ибо там все однотипно тому, что обозначено выше. Бенчмарки? Да простой бенчмарк. Tstopwatch и цикл на миллион вычислений выражения. Зы. Временами вопросы меня в тупик ставят) выложена часть кода. Все остальное однотипно, до все рьяно просят выложить весь код. Недопонимаю зачем) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2019, 18:59 |
|
Парсер выражений
|
|||
---|---|---|---|
#18+
sergq, давай я процитирую твой вопрос. А что так медленно работает первый вариант? Неужели все изза обхода дерева? Хотя там только вызовы идут в основном. А теперь давай поменяемся ролями. Представь что я задал этот вопрос а ты отвечаешь? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2019, 19:13 |
|
Парсер выражений
|
|||
---|---|---|---|
#18+
sergqСмысла не вижу выкладывать все. Ибо там все однотипно тому, что обозначено выше. Сколько раз память выделяется из кучи? Сделай чтобы было 0 раз и сравни производительность. Это для начала. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2019, 19:58 |
|
Парсер выражений
|
|||
---|---|---|---|
#18+
sergqСобственно вопрос. А что так медленно работает первый вариант? Неужели все изза обхода дерева? Хотя там только вызовы идут в основном. Потому, что он делает то же самое что и второй + еще кучу работы. Попробуйте его дизассемблировать пройтись step-by-step в каком-нибудь windbg - там вместо add ax, bx будет большой оверхед на вызов метода (получить адрес из VMT, сохранить состояние в стек и прочее) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2019, 20:29 |
|
|
start [/forum/topic.php?fid=16&fpage=10&tid=1339958]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 229ms |
total: | 376ms |
0 / 0 |