Реализация анализатора (парсера) формул времени выполнения |
Здравствуйте, гость ( Вход | Регистрация )
Реализация анализатора (парсера) формул времени выполнения |
AntonTatu |
10.3.2009, 12:49
Сообщение
#51
|
Студент Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: 0 |
..получил увеличение производительности больше чем в 12 раз. А что нужно сделать что бы переделать Вот этот кусочек
на на такой
т.е. необходимо создать формулу, посчитать ее, j=0; f.addOp( new VarOp( &arr[ 0 ][ j ] ) ); f.addOp( new VarOp( &arr[ 3 ][ j ] ) ); f.addOp( new VarOp( &arr[ 7 ][ j ] ) ); res = f.calc(); передвинуться на следующий j -й столбец массива arr, посчитать, j : =j+1; res = f.calc(); на следующий.. j : =j+1; res = f.calc(); и т.д. т.е. что бы появилась возможность "сдвигать" формулу и, не перестраивая формулу заново и не генерируя новый массив ? Сообщение отредактировал AntonTatu - 10.3.2009, 17:36 |
|
|
SABROG |
10.3.2009, 20:21
Сообщение
#52
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
|
|
|
Litkevich Yuriy |
10.3.2009, 20:24
Сообщение
#53
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
SABROG |
10.3.2009, 20:29
Сообщение
#54
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
|
|
|
BRE |
10.3.2009, 20:46
Сообщение
#55
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
т.е. что бы появилась возможность "сдвигать" формулу и, не перестраивая формулу заново и не генерируя новый массив ? Ну барин ты задачки задаешь. (с) Переделать операцию VarOp или сделать еще одну операцию (это набросок).
Таким образом можно наделать разных необходимых операций, ввести переменные и т.д. Например, если у всех переменных необходимо изменять j, можно сделать такую операцию, которая это будет делать вызовом одной функции. Думай пробуй. |
|
|
AntonTatu |
10.3.2009, 23:38
Сообщение
#56
|
Студент Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: 0 |
Ну барин ты задачки задаешь. (с) ............................................. ............................................. Таким образом можно наделать разных необходимых операций, ввести переменные и т.д. Например, если у всех переменных необходимо изменять j, можно сделать такую операцию, которая это будет делать вызовом одной функции. Думай пробуй. Да у самого голова уже пухнет , залез в такие дебри в которых мало что понимаю Последний вопрос связанный вот с этим , и все.... вот эта часть
как сделать так что бы при сложении если на стеке ( m_stack.push( v1 + v2 ) число больше ну к примеру 100 (или любого какое нравится) остановить подсчет Formula::calc() и вывести результат ? я сделал так.... вот
все работает как надо, но мне кажется что можно было както проще сделать ? Сообщение отредактировал AntonTatu - 11.3.2009, 0:21 |
|
|
BRE |
11.3.2009, 6:12
Сообщение
#57
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Мне кажется, что логичней, если сам метод run() будет сообщать нужно ли продолжать вычисления.
вот
Еще желательно ввести методы для очистки стека, т.к. при таком прерывании операции возможны случаи, когда в стеке останутся данные. Можно ввести такое понятие как контекст, в котором хранить арифметический стек, состояние (ошибка), исходные данные, локальные переменные. Тогда мы бы избавились от статического стека и получили возможность пихать расчет формул по разным потокам. Если будут еще вопросы задавай, мне самому интересен этот вопрос. Сообщение отредактировал BRE - 11.3.2009, 8:39 |
|
|
AntonTatu |
11.3.2009, 11:09
Сообщение
#58
|
Студент Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: 0 |
Мне кажется, что логичней, если сам метод run() будет сообщать нужно ли продолжать вычисления. Так и знал что можно было огород не городить......с флажком... Цитата Еще желательно ввести методы для очистки стека, т.к. при таком прерывании операции возможны случаи, когда в стеке останутся данные. сделал так: вот
Если выход из цикла будет по break, то в стэке будет какой то результат, но в этом случае очищать его мне ненужно, т.к., я его в дальнейшем использую... (мне его наооборот получать нужно ) Цитата Можно ввести такое понятие как контекст, в котором хранить арифметический стек, состояние (ошибка), исходные данные, локальные переменные. Тогда мы бы избавились от статического стека и получили возможность пихать расчет формул по разным потокам. Если будут еще вопросы задавай, мне самому интересен этот вопрос. вот это очень интересно, т.к. скорости мне все равно хочется больше... (если компилировать dll ку с массивом получается намного быстре, только компилятор таскать за собой не получится...) |
|
|
BRE |
11.3.2009, 11:31
Сообщение
#59
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
//Очищаем стэк перед новым расчетом //хотя заметил что перед новым расчетом стэк всегда пуст, даже если предыдущий выход из цикла был по брэйку...., //наверно и очищать его не нужно.... и функция лишняя... ? Вот смотри формула: 100 200 300 400 0 / * + + происходит ошибка: Деление на 0, в стеке: 100 200 300 400 Тут от формулы зависит. вот это очень интересно, т.к. скорости мне все равно хочется больше... (если компилировать dll ку с массивом получается намного быстре, только компилятор таскать за собой не получится...) С нативом даже не сравнивай, не расстраивай себя. Такой производительности не будет. Контексты набросаю чуть позже... |
|
|
BRE |
11.3.2009, 21:44
Сообщение
#60
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Добавил контексты.
Разбил по файлам. Кратко документировал. Проект в архиве.
Прикрепленные файлы
|
|
|
Текстовая версия | Сейчас: 30.1.2025, 1:48 |