раз парсинг, два парсинг ... n парсинг!

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

раз парсинг, два парсинг ... n парсинг!

Сообщение pronto » 08.08.2006 (Вт) 16:48

Исследование функций с помощью компьютера - дело интересное. Однако, при близком рассмотрении оказалось, что во всем этом есть ньансы.
Для построения графика функции заданной в привычном виде, например, "y = sin(x/20)*40 + sin(x/9)*30" возникает необходимость многократного ее парсинга для различных значений аргумента x. Такой подход сводит на нет все попытки максимально ускорить процесс парсинга, и уже при ~1000 итераций построение графика занимает ~1 секунду.
График аналогичной функции заданной в коде программы, при ~10 000 итераций, что близко к требуемому, строится за ~30 миллисекунд. Вот и возникает справедливый вопрос. Как совместить удобство первого варианта со скоростью второго?
O, sancta simplicitas!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.08.2006 (Вт) 16:52

Написать свой компилятор. Либо взять чужой.
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 08.08.2006 (Вт) 16:57

А если подключить ScriptControl? Передать в него цикл, содержащий исследуемую функцию, и объект, аккумулирующий результаты выполнения. Или вместо абстрактной коллекции объект, сразу строящий график. Хотя, если одна секунда это много, то в скрипте, вероятно, будет еще больше.
Лучший способ понять что-то самому — объяснить это другому.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Сообщение pronto » 08.08.2006 (Вт) 17:08

Про компилятор я думал, но дюже проблематично будет - ради интереса-то.
O, sancta simplicitas!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 08.08.2006 (Вт) 20:03

Чем парсишь? Пробовал эвалютатор GSerg-а? Он быстрый... но бажный.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.08.2006 (Вт) 20:13

Он, кажется, правоассоциативный... Там 1-1-1 = 1
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.08.2006 (Вт) 20:20

Хакер писал(а):бажный.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 08.08.2006 (Вт) 21:58

Ну я имел ввиду не совсем то. Там при обработки длинных и много-скобко-содержащих выражений случалась ошибка Стек переполнен.

Могу выложить свой. Он без этих 2 ошибок но работает в 2-3 раза медленней.

Добавлено: "Медлено" понятие относительно. Выражение "1+2+3+4+5+...+5000" он подсчитывает за 300 мс.
Последний раз редактировалось Хакер 09.08.2006 (Ср) 6:07, всего редактировалось 1 раз.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Efiop
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 69
Зарегистрирован: 06.06.2006 (Вт) 12:14
Откуда: РК

Сообщение Efiop » 09.08.2006 (Ср) 5:59

pronto, а есть код, чтоб посмотреть?

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Сообщение pronto » 09.08.2006 (Ср) 8:04

Есть, но не мой. Надо?

ЗЫ. Думаю, что надо. Поэтому...
Вложения
Evaluator.rar
(5.42 Кб) Скачиваний: 51
O, sancta simplicitas!

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Сообщение kuhtiov » 09.08.2006 (Ср) 9:02

А вы не поясните (в целях повышения образованности), что такое парсинг?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 09.08.2006 (Ср) 9:15

В целях образованности: парсинг (parsing) есть синтаксический анализ какого-либо выражения. Ну например это может быть анализ математического выражения для его последующего вычисления.
Весь мир матрица, а мы в нем потоки байтов!

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Сообщение kuhtiov » 09.08.2006 (Ср) 9:17

Ааааааа, спасибо за пояснение

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 09.08.2006 (Ср) 20:55

kuhtiov писал(а):Ааааааа, спасибо за пояснение
Может мне еще кто-нибудь пояснит, зачем при построении графика функции её многократный [цитата автора] парсинг вместо одного? Или у автора y=Fx(x), где Fx=F(x)?
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 09.08.2006 (Ср) 21:07

vvs_adm
Он делает многократную эвалютацию, ибо функция у него не прямолинейная. Я бы автору посоветовал, написать свой парсер, да так, чтоб он всё что не зависит от X - парсил заранее.

Ну например.

Есть функция
F(x) = Sin(x) + ( X / ( 1 + 2 +3 ) )

так вот отсюда можно выдрать часть и посчитать для неё коэффициент, ещё до итерайий. А уж во время итерация парсить функцию Sin(x) + k*x

90% времени парсинга уходят не на вычисления а на сам парсинг.

И функция
F(x) = ((((((((((((((((((x + 5))))))))))))))))))
будет выполнять оооой, как долго, хотя эквивалент [x+5] выпролнится быстро.

Т.е. смысл всего этого (что я написал) в том, что перед парсингом надо по максимуму упростить функцию, чтобы парсинг проходил быстрее.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 09.08.2006 (Ср) 21:22

Жаль, что нихрена не понял :( На сегодня пива хватит. Но про многократный парсинг единственной бедной функции стоит еще раз подумать. Потому что пока все-таки не понял, зачем сто раз парсить функцию F(x)=sin(x)+x/(1+2+3), которая парсится всего один раз к виду например F(x)=x sin x 1 2 3 + + / + (ну может чуть ошибся [таки пиво, да и давно это было], но это приблизительно постфикная запись).
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 09.08.2006 (Ср) 22:12

Гм...

х каждый раз меняется...

Каждый раз считается заново Sin(x) и X / 6 - на это уходит кача времени. Но не конкретно на это, а но то, чтоб эвалютатор понял что нужно сделать именно это, а потом уже считал.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 09.08.2006 (Ср) 22:21

Хакер писал(а):Но не конкретно на это, а но то, чтоб эвалютатор понял что нужно сделать именно это.
Нормальный "эвалютатор" (смысл странного слова угадываем с помощью волшебного свойства самого автора) поймет это после первого парсинга функции. После чего функция превратится в дерево, в листья которой надо будет воткнуть Х. При желании можно просканить ветви дерева на предмет возмого предподсчета, дабы каждый раз не считать (1+2+3). Но пиво мне все таки все еще твердит - парсить функцию при подставлении очередного Х больше не надо :(
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 09.08.2006 (Ср) 22:47

Эвалютатор (от слова Eval***) не знает что в следующий раз он получит ту же функцию что и в прошлый раз. Эвалютатор просто тупо просчитывает выражение и забывает его.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Re: раз парсинг, два парсинг ... n парсинг!

Сообщение vvs_adm » 09.08.2006 (Ср) 23:01

pronto писал(а):Для построения графика функции заданной в привычном виде, например, "y = sin(x/20)*40 + sin(x/9)*30" возникает необходимость многократного ее парсинга для различных значений аргумента x.
Где там написано, что эвалютатор обязан забыть предварительно пропарсенную функцию? Там лишь написано, что алгоритм составлен через задницу.
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 09.08.2006 (Ср) 23:18

Я про эвалютатор в принципе. А если некий модуль, что то ещё замониает, а в следующий раз вспоминает, и проверяет не то ли это, что он запомнил в прошлый раз... это уже не эвалютатор. Это уже AI.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 09.08.2006 (Ср) 23:30

Нахрена такие извращения. Просто у эвалютатора есть (должно быть) два метода : 1) пропарсить 2) подставить в пропарсенную перед этим функцию значение х, у и еще одну неизвестную. И все. И теперь автору темы можно при построении графика функции парсить ее при каждом новом Х хоть четыре раза. Главное - не забыть подставить потом один раз Х.
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 09.08.2006 (Ср) 23:36

Эвалютатор работает так.

Сначала проверяет кол-во открытых закрытых скобочек. Если всё ок.

Рекурсивно подсчитывает.

Рекурсиваня функция выглядет так: ищет оператор с наибольшим приоритетом, подсчитывает. Если операнд - скобки - выполняет сама себя, передав в аргумент, выражение находящееся внутри скобок. И так пока выражение не преваратится в 1 число.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 09.08.2006 (Ср) 23:45

Это твой эвалютатор :) Эвалютатор для построения графика функции работает так: 1) парсинг - построение дерева, где в вершине оператор, в листьях операнды (не надо уничтожать построенное дерево) 2) подстава в те листья, где не число, а Х, значение икса, после чего проход по дереву с вычислением получившегося выражения. Можно конечно при построении функции применять "одноразовый" эвалютатор, но зачем?
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Сообщение pronto » 10.08.2006 (Чт) 3:22

Даже и не представлял, что эта тема вызовет такое бурное обсуждение! Видно, многих, а не только меня, эта тема уже затрагивала в той или иной степени. Я уже перелистывал литературу по асму и там мне встречался пример "постфиксной" записи. Это и мат. сопроцессор наталкивают склониться к варианту компилирования функции. Но я абсолютно не представляю с какой стороны ко всему этому подходить!
O, sancta simplicitas!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 10.08.2006 (Чт) 7:06

"Вы еще подеритесь, горячие финские парни!"©
Весь мир матрица, а мы в нем потоки байтов!

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 10.08.2006 (Чт) 9:06

Пример компилирования функций в постфиксную запись, если привинтить стековый эвалютор, то получиться простейший компилятор математических выражений.
Вложения
Fix_Main.zip
(2.69 Кб) Скачиваний: 39

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Сообщение pronto » 20.09.2006 (Ср) 9:45

Да-а-а... Давненько я не захаживал сюда - некогда было. Но интерес к проблеме еще остался, как и сама проблема. Нарыл кучу материала по переводу в постфикс, изучил три готовых кода (хоть и медленных, но хоть каких-то) в процессе написания собственного кода сталкнулся с трудностями, пока непреодолимыми, которые связаны с частичной правильной работоспособностью алгоритма. В добавок ко всему он получился немногим более быстрым чем те, что уже есть ~750 мс (для тестового выражения "1+2+...+5000"). Поэтому, Хакер, если не трудно, то, пожалуйста, выложи свой парсер, который, как заявлено, работает в 2.5 раза быстрее - хоть посмотреть на сие чудо!

З.Ы. Если переложить его на другой язык (Си, PowerBasic), то можно ли добиться его ускорения и во сколько раз?
O, sancta simplicitas!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 20.09.2006 (Ср) 10:07

По-моему тема о скорости выполнения одного и того же алгоритма на разных языках многократно обсуждалась. Время выполнения зависит в основном от алгоритма.
Весь мир матрица, а мы в нем потоки байтов!

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Сообщение pronto » 20.09.2006 (Ср) 10:10

Эт-то понятно. Я про "тупой" перенос алгоритма.
O, sancta simplicitas!

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 110

    TopList