![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
BRE |
![]()
Сообщение
#31
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
формула считается в цикле, с каждой итерацией формула новая, ее длинна то же может изменится..., переменные в формуле это значения разных ячеек массива, на выходе каждой итерации необходимо получить расчетное значение итой формулы, колличество прогонов (итераций) миллионы.... ![]() Исходя из этого сообщения, я не представляю реализацию с dll. ![]() Алгоритм: Рассчитали и заполнили массив с переменными; for( миллион итераций ) { Получили строку с формулой; Сгенерировали исходный файл (не важно С/asm); Запустили компилятор; Дождались завершения компиляции; Запустили линкер; Дождались завершения линковки; Загрузили dll; Resolve функцию; Выполнили функцию; Вернули результат; } Тебе не кажется, что время исполнения это цикла будет значительно больше чем выполнения того же скрипта на QtScript? А я так понял, что его скорость тебя уже не устраивает. Как генерируется сама формула? Обьясни по-подробней, чувствую все можно сделать проще и не такими экзотическими способами. |
|
|
SABROG |
![]()
Сообщение
#32
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Я так понял, что у него проблема с тем, что в рантайме надо выполнять сгенеренную формулу, но из-за всяких проверок (машина с конечным автоматом) это происходит медленно, в то время как современные компиляторы оптимизируют любую формулу еще на этапе компиляции и превращают её в машинный код, который не проверяет никаких условий (тип операции: умножение, деление и т.д.), а работает только с данными. Короче готовый продукт.
На самом деле мне приходит на ум только одна область где может применяться технология - архивация/сжатие данных, а dll или exe - SFX распаковщик. Но это с учетом того, что архиватор генерит некую уникальную формулу на основе подсунутых файлов, которые надо сжать. |
|
|
BRE |
![]()
Сообщение
#33
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Я так понял, что у него проблема с тем, что в рантайме надо выполнять сгенеренную формулу, но из-за всяких проверок (машина с конечным автоматом) это происходит медленно, в то время как современные компиляторы оптимизируют любую формулу еще на этапе компиляции и превращают её в машинный код, который не проверяет никаких условий (тип операции: умножение, деление и т.д.), а работает только с данными. Короче готовый продукт. Цитата формула считается в цикле, с каждой итерацией формула новая, ее длинна то же может изменится..., переменные в формуле это значения разных ячеек массива, на выходе каждой итерации необходимо получить расчетное значение итой формулы, колличество прогонов (итераций) миллионы.... Т.е. на каждой итерации как-то генерируется разная формула -> собирать библиотеку на каждой итерации. На самом деле встает вопрос, почему не вычислять формулу на этапе ее генерации? Получили x[0,j]*x[2,j]*x[5,j]*x[10,j] - посчитали, получили x[0,j]*x[3,j]*x[4,j] - посчитали, прибавили. Конечно, здесь необходимо уточнить как, кто и какую формулу можно сгенерировать. Может формула состоит из повторяющихся выражений с разными переменными, здесь тоже можно попробовать помудрить. Короче, тут простор для исследований, все нужно пробавать. IMHO, путь с realtime-генерацией библиотеками, ээээ, ну не опревданный что-ли. |
|
|
AntonTatu |
![]()
Сообщение
#34
|
Студент ![]() Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата Исходя из этого сообщения, я не представляю реализацию с dll. ![]() Я дико извиняюсь, ввел всех в заблуждение (сижу понять не могу фигню какую то написал в предыдущем своем посте), правильно так: Алгоритм: 1. Считается формула такого вида: x[0,j]*x[2,j]*x[5,j]*x[10,j]+x[0,j]*x[3,j]*x[4,j]+N+..... формула может быть разной в зависимости от задачи (разной длинны, с разным количеством переменных, но структура именно такая как показано 2. Из формулы генерится dll в цикле (100000 раз){ 2. Генерится специальным образом массив, ячеек в массиве столько сколько переменных x[переменная,j] в формуле 3. формула высчитывается по массиву (подготовленной dll) 4. Записывается ответ } ЗЫ: понял почему фигню написал, голова была занята тем как считать не всю формулу сразу, а почастям... ![]() Теперь алгоритм верный, может у кого рнибудь есть предложения , куда "копать" ? Сообщение отредактировал AntonTatu - 6.3.2009, 21:25 |
|
|
BRE |
![]()
Сообщение
#35
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Алгоритм: 1. Считается формула такого вида: x[0,j]*x[2,j]*x[5,j]*x[10,j]+x[0,j]*x[3,j]*x[4,j]+N+..... формула может быть разной в зависимости от задачи (разной длинны, с разным количеством переменных, но структура именно такая как показано 2. Из формулы генерится dll в цикле (100000 раз){ 2. Генерится специальным образом массив, ячеек в массиве столько сколько переменных x[переменная,j] в формуле 3. формула высчитывается по массиву (подготовленной dll) 4. Записывается ответ } Ага. Как вариант: 1. Считается формула 2. Распарсивается в обратную польскую, только место конкретных чисел храняться ссылки на соответствующие элементы в массиве. в цикле (100000 раз) { 3. Генерится специальным образом массив, ячеек в массиве столько сколько переменных x[переменная,j] в формуле 4. запускается расчет формулы (место ссылок на элементы подставляются значения из массива) 5. Записывается ответ } Т.е. сначала готовим формулу для быстрого вычисления. |
|
|
AntonTatu |
![]()
Сообщение
#36
|
Студент ![]() Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
4. запускается расчет формулы (место ссылок на элементы подставляются значения из массива) я вот этот пункт понять не могу, есть у меня формула (строка типа QString), преобразовал я ее в обратную польскую, (это значит распарсил ?), а что значит "в место ссылок на элементы подставляются значения из массива" ? я просто не понимаю, если я формулу преобразовал в обратную польскую на выходе тоже ж QString ? просто я итак могу формулу разобрать считывая строчку слево на право (без польской нотации), смотреть индекс переменных и сверяясь с ячейками массива считать функцию, но этот способ медленный (не быстрее чем с помощью QScript) подумал еще ![]() Сообщение отредактировал AntonTatu - 7.3.2009, 1:07 |
|
|
BRE |
![]()
Сообщение
#37
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
подумал еще ![]() +1 Парсер переводит математическую формулу в список необходимых операций. Делаем класс стек выполнений:
Вводим виртуальный базовый класс для всех операций:
Вводим класс формулу (список операций):
Теперь, формула A + B * C + D в обратной польской нотации будет: ABC*+D+ Для примера: A - arr[ 0 ][ 4 ]; B - arr[ 3 ][ 7 ]; C - arr[ 7 ][ 1 ]; D - arr[ 4 ][ 8 ];
Как с этим закончим, можно будет попробовать оптимизировать. ![]() |
|
|
AntonTatu |
![]()
Сообщение
#38
|
Студент ![]() Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата Как с этим закончим, можно будет попробовать оптимизировать. ![]() Третий день сижу, что то не побороть никак, ------ Построение начато: проект: one, Конфигурация: Debug Win32 ------ Компиляция... main.cpp Компоновка... main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall MathStack::push(double)" (?push@MathStack@@QAEXN@Z) в функции "public: virtual void __thiscall VarOp::run(void)" (?run@VarOp@@UAEXXZ) main.obj : error LNK2001: неразрешенный внешний символ ""protected: static class MathStack Operation::m_stack" (?m_stack@Operation@@1VMathStack@@A)" C:\Documents and Settings\Anton\Мои документы\Visual Studio 2008\Projects\one\Debug\one.exe : fatal error LNK1120: 2 неразрешенных внешних элементов Журнал построения был сохранен в "file://c:\Documents and Settings\Anton\Мои документы\Visual Studio 2008\Projects\one\one\Debug\BuildLog.htm" one - ошибок 3, предупреждений 0 ========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ========== Переписал вот что :
и
но это что называется в глаза бросилось... а ошибки все равно сыплет... Сообщение отредактировал AntonTatu - 9.3.2009, 2:27 |
|
|
BRE |
![]()
Сообщение
#39
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall MathStack::push(double)" Все, что я написал выше это набросок, что бы описать идею, а не законченный код. Ты определили функции MathStack?
или сделай пока так:
но это что называется в глаза бросилось... а ошибки все равно сыплет... Ошибки я сам видел, набирал прямо здесь, но функция редактирования у меня была еще не активна. ![]() Покажи, что сейчас получилось... Сообщение отредактировал BRE - 9.3.2009, 11:00 |
|
|
AntonTatu |
![]()
Сообщение
#40
|
Студент ![]() Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата Покажи, что сейчас получилось... Прежде всего огромное спасибо за участие ! Я понимаю что это "набросок", но к сожалению моих знаний и понимания катастрофически не хватает.. "Набросок" в кавычках, потому что понятно что все уже разжовано до мелочей, а у мне с ручника не снятся ![]() Не компилируется если написано
как только static убираю ошибка в этой строчке уходит, еще ругается вот в этом месте Цитата Operation::m_stack.pop(); .\main.cpp(123) : error C2228: выражение слева от ".pop" должно представлять класс, структуру или объединение сейчас получилось вот что (переписывал все в однин cpp файл, как зарабортает (будет супер) разнесу в h) код
Сообщение отредактировал Litkevich Yuriy - 9.3.2009, 14:01 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 18.2.2025, 10:36 |