![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
AntonTatu |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Всем привет !
Вопрос в следующем, имеется прога которая генерирует некоторую формулу (формула меняет количество своих параметров в зависимости от исходных значений в программе ), в этой же проге есть массив который использует полученную формулу в дальнейших расчетах, хочется создать из формулы dll ку и потом ее вызывать в нужном месте программы, как это сделать? С вызовом полученной dll я вроде бы разобрался, а вот как научить прогу генерить dll ку понять не могу. ЗЫ: Какие можно использовать компилятор/линковщик (минимум занимаемого места, требуемых для работы файлов, потдержка STL требуется) Выручайте ! ![]() |
|
|
![]() |
kuler |
![]()
Сообщение
#2
|
![]() Танцор диско ![]() ![]() ![]() Группа: Участник Сообщений: 441 Регистрация: 11.9.2008 Из: Москва Пользователь №: 289 Спасибо сказали: 6 раз(а) Репутация: ![]() ![]() ![]() |
если в студии, то там всего лишь надо указать тип выходного файла
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#3
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
а вот как научить прогу генерить dll ку понять не могу. ни как, надо создать проект для dll'кисм тему |
|
|
SABROG |
![]()
Сообщение
#4
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Можно таскать вместе с программой MinGW
![]() Зачем генерить dll? Лучше скрипты генерить. |
|
|
ViGOur |
![]()
Сообщение
#5
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
SABROG, думаю твой пост не к месту.
![]() Просто есть два варианта: AntonTatu, не совсем понимает, как и что раюотает и что должно происходить или он прекрасно понимает что ему нужно, но не правильно объяснил. Надеюсь вы знаете насчет криптованных exe файлов, которые сами себя перевоссоздают, правда это относится к вирусо писательству. ![]() |
|
|
SABROG |
![]()
Сообщение
#6
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
trdm |
![]()
Сообщение
#7
|
Дмитрий Трошин ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 575 Регистрация: 12.1.2008 Пользователь №: 68 Спасибо сказали: 21 раз(а) Репутация: ![]() ![]() ![]() |
А я вообще не врубился в "генерирует формулу"....
Очень смахивает на патерн интерпретатор, название которого уже и есть решение: использовать интерпретатор и создавать не формулу, а файло на скриптовом языке... и юзать его... или я ничерта не понял..... Короче, автор, используй встроенный интерпретатор. Сообщение отредактировал trdm - 4.3.2009, 19:40 |
|
|
AntonTatu |
![]()
Сообщение
#8
|
Студент ![]() Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Человеку надо генерить dll, я предложил единственно правильный способ как для linux, так для windows - кроссплатформенная компиляция (MinGW). В принципе надо всего-то сгенерить С++ файл и вызвать компилятор с параметрами. Попробую объяснить по другому: Во время выполнения программы из рисунка по некоему алгоритму составляется формула в конце концов принимающая вид типа: QString str = "A+B*C+D*E+G" переменные этой формулы (числовые значения A, B, C и т.д.) на момент компиляции программы не известны, длинна формулы (количество переменных ) то же, может быть и такой вариант: A+A+A*D*E+B+C, соответственно единственный выход (который я вижу) это: 1.Запустить программу, получить формулу 2.Загнать формулу в фунцию, создать с этой функцией C++ файл 3. Создать из этого C++ файла библиотеку dll 4. Использовать этот dll в программе 5. Получить числовой ответ PS: Формула может быть огромна, разбирать ее на лету с помощью ну к примеру конечных автоматов нереально долго (пробовал) Как сохранить формулу в текстовый файл (С++) проблемы нет, как использовать созданную dll вроде то же понятно (в Google есть) Вопрос в том какой компилятор (С++) использовать ? (должен уметь STL и требовать как можно меньше файлов для запуска себя (один экзешник и все было бы замечательно), что бы вместе со своей прогой еще и 200 мб, компилятора не таскать) , может есть где пример вызова компилятора из командной строки очень поможет. И еще вопрос, какие компиляторы можно использовать если я пишу софт на продажу (ну это так для общего развития) ![]() Что то прочитал свой опус, наверно опять непонятно объяснил, не суть вопрос больше касается именно выбора компилятора. А я вообще не врубился в "генерирует формулу".... Очень смахивает на патерн интерпретатор, название которого уже и есть решение: использовать интерпретатор и создавать не формулу, а файло на скриптовом языке... и юзать его... или я ничерта не понял..... Короче, автор, используй встроенный интерпретатор. зачем придумывать интерпритатор, если можно воспользоваться обычным вызовом dll ки, весь вопрос в том как ее правильно создавать используя сторонние компиляторы C++ из командной строки ? (так полюбому быстрее будет, а скорость в моем случае очень важна) а пример использования файла на скриптовом языке где можно посмотреть ? ![]() |
|
|
Admin |
![]()
Сообщение
#9
|
Администратор ![]() ![]() ![]() ![]() Группа: Администратор Сообщений: 646 Регистрация: 9.10.2007 Из: crossplatform.ru Пользователь №: 1 Спасибо сказали: 17 раз(а) Репутация: ![]() ![]() ![]() |
SABROG, перечитал твое сообщение, и решил извиниться перед тобой. ЭТО Я БЫЛ НЕ ПРАВ! Извини, не понял, что ты имел ввиду.
![]() p.s. удаленный тобой пост вернул на место. Нужно больше отдыхать, мне. ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#10
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
AntonTatu, а QtScript тебе для этих целей тоже не подходит?
|
|
|
AntonTatu |
![]()
Сообщение
#11
|
Студент ![]() Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
ViGOur |
![]()
Сообщение
#12
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
а "скрипты генерить" это и есть QtScript ? (что почитать ?) QtScript - для того, чтобы скрипты писать. А что они будут делать, зависит только от тебя. ![]() Почитай: QtScript Module Сообщение отредактировал ViGOur - 4.3.2009, 21:11 |
|
|
trdm |
![]()
Сообщение
#13
|
Дмитрий Трошин ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 575 Регистрация: 12.1.2008 Пользователь №: 68 Спасибо сказали: 21 раз(а) Репутация: ![]() ![]() ![]() |
Попробую объяснить по другому: ....поскипано.... все это крайне странно выглядит.... а "скрипты генерить" это и есть QtScript ? (что почитать ?) QtScript - для того, чтобы скрипты писать. А что они будут делать, зависит только от тебя. ![]() Почитай: QtScript Module QtScript - для того, чтобы скрипты ИСПОЛНЯТЬ. Разница существенная. Таки как раз в скрипт можно передавать сгенеренную формулу, а на выходе получит результ её исполнения. |
|
|
AntonTatu |
![]()
Сообщение
#14
|
Студент ![]() Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
[/quote]
QtScript - для того, чтобы скрипты ИСПОЛНЯТЬ. Разница существенная. Таки как раз в скрипт можно передавать сгенеренную формулу, а на выходе получит результ её исполнения. [/quote] А что по скорости выполнения ? , вот что написано у М.Шлее: "При создании объектов функций важно учитывать то обстоятельство, что трансляция объекта Function выполняется при каждом его использовании, вследствие чего исполнение кода будет гораздо медленнее, чем при исполнении обычных функций языка сценариев. " Насколько на Ваш взгляд такая функция будет выполнятся медленнее чем скомпилированная в dll ку ? |
|
|
trdm |
![]()
Сообщение
#15
|
Дмитрий Трошин ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 575 Регистрация: 12.1.2008 Пользователь №: 68 Спасибо сказали: 21 раз(а) Репутация: ![]() ![]() ![]() |
Цитата QtScript - для того, чтобы скрипты ИСПОЛНЯТЬ. Разница существенная. Таки как раз в скрипт можно передавать сгенеренную формулу, а на выходе получит результ её исполнения. А что по скорости выполнения ? , вот что написано у М.Шлее: "При создании объектов функций важно учитывать то обстоятельство, что трансляция объекта Function выполняется при каждом его использовании, вследствие чего исполнение кода будет гораздо медленнее, чем при исполнении обычных функций языка сценариев. " Насколько на Ваш взгляд такая функция будет выполнятся медленнее чем скомпилированная в dll ку ? нормальное замечание. не знаю. если верить Шлее и предположить, что трансляция - есть разбор+интерпретирование, тогда использование QtScript может быть и не оправдано.... есть скриптовые языки у которых разделены фазы разбора+формирование байткода и интерпретация. я так понял формула некоторое время не меняется, а входные параметры меняются. правильно? |
|
|
AntonTatu |
![]()
Сообщение
#16
|
Студент ![]() Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата нормальное замечание. не знаю. если верить Шлее и предположить, что трансляция - есть разбор+интерпретирование, тогда использование QtScript может быть и не оправдано.... есть скриптовые языки у которых разделены фазы разбора+формирование байткода и интерпретация. я так понял формула некоторое время не меняется, а входные параметры меняются. правильно? ну в общем да, получается что то вроде цикла: формула 1 -> фходные параметры 1 формула 1 -> фходные параметры 2 формула 1 -> фходные параметры 3 формула 1 -> фходные параметры N формула 2 -> фходные параметры 1 формула 2 -> фходные параметры 2 формула 2 -> фходные параметры N формула k -> фходные параметры N формула 1 -> фходные параметры 1 формула 1 -> фходные параметры 2 формула 1 -> фходные параметры 3 и т.д. Я в принципе уже написал вариант на Delphi, в нем для того чтобы использовать компилятор достаточно выдрать экзешник + пару дллок.., теперь переписываю под QT, а вот компилятор С++ подобрать не могу все за собой хвост тащат в энное кол во мегабайт и файлов... |
|
|
SABROG |
![]()
Сообщение
#17
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Формула может быть огромна, разбирать ее на лету с помощью ну к примеру конечных автоматов нереально долго (пробовал) Как сохранить формулу в текстовый файл (С++) проблемы нет, как использовать созданную dll вроде то же понятно (в Google есть) Вопрос в том какой компилятор (С++) использовать ? (должен уметь STL и требовать как можно меньше файлов для запуска себя (один экзешник и все было бы замечательно), что бы вместе со своей прогой еще и 200 мб, компилятора не таскать) , может есть где пример вызова компилятора из командной строки очень поможет. И еще вопрос, какие компиляторы можно использовать если я пишу софт на продажу (ну это так для общего развития) ![]() Если взвешивать все за и против, то получается такая картина. Лучше C/C++ компилятора никакой скриптовый язык не даст нужной оптимизации кода под конкретный процессор, к тому же, естественно, машинный код будет выполняться гораздо быстрее. Из-за такой особенности получается, что саму программу придется разбить на серверную (демон) и клиентские части. Если клиентская часть достаточно быстро разбирает рисунок и переводит её в формулу, то на сервер можно отправлять только сам текст этой формулы. Иначе тупо предоставлять интерфейс для заливки рисунка на сервер. Это может быть и php скрипт. Задача сервера по формуле сформировать исходники и передать на выполнение компилятору. Затем сервер информирует клиента, что модуль готов и клиент добавляет его к себе в лист. После этого этим модулем можно пользоваться, но запускаться он будет на серверной машине по команде клиента. Смена компиляторов и ОС будет для пользователя прозрачной. Совсем другое дело, если пишется какой-нибудь новый архиватор типа winrar'a, тут тогда ситуация безвыходная. Либо размер дистрибутива вместе с компилятором, либо скорость. |
|
|
Константин |
![]()
Сообщение
#18
|
![]() Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 9.2.2009 Пользователь №: 539 Спасибо сказали: 15 раз(а) Репутация: ![]() ![]() ![]() |
потому, что компилятор предназначен для компилирования. и тащит компилятор за собой ровно столько, сколько хочет за собой таскать, т.к. является опциональной базой любого дистриутива, в котором может потребоваться что-то собрать. и люди в здравом уме используют компилятор по прямому назначению, а не таскают его /* куски */ за своими проектами в весьма сомнительных целях.
если беспокоит скорость работы QtScript, welcome to Python; иначе QtScript и минимум мозго????ва. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#19
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
trdm |
![]()
Сообщение
#20
|
Дмитрий Трошин ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 575 Регистрация: 12.1.2008 Пользователь №: 68 Спасибо сказали: 21 раз(а) Репутация: ![]() ![]() ![]() |
PS: Формула может быть огромна, разбирать ее на лету с помощью ну к примеру конечных автоматов нереально долго (пробовал) странно, у меня например глобальный модуль от 1С-ки весит 1.5 Мб. Разбирал с пом. bison-a, 2-3 секунды.... не пойму, что у вас с быстродействием. |
|
|
AntonTatu |
![]()
Сообщение
#21
|
Студент ![]() Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
А что по скорости выполнения ? , вот что написано у М.Шлее: рекомендую для начала по пробовать, и если на практике окажется неприемлемое быстродействие, тогда будешь искать другой вариант.ну вобщем попробовал, если использовать QtScript получается оччень медлено, использовал следующий скрипт:
х - это массив значений посчитанный в С++ и переданный скрипту engine.globalObject().setProperty("x", MyArray); в теле функции в скрипте используются различные значения массива x[i][j], я так понимаю что медленно потому что приходится скрипту передавать весь массив целиком (т.е. делать для него копию), а при использовании dll ки весь массив не копируется, а значение передается по ссылке, а может быть можно как то в скрипту указывать ссылку а не делать "копию" всех значений массива ? |
|
|
Гость_BRE_* |
![]()
Сообщение
#22
|
Гости ![]() |
я так понимаю что медленно потому что приходится скрипту передавать весь массив целиком (т.е. делать для него копию), а при использовании dll ки весь массив не копируется, а значение передается по ссылке, а может быть можно как то в скрипту указывать ссылку а не делать "копию" всех значений массива ? Самое простое сделать класс (еще проще (но не обязательно) если наследоваться от QObject), который будет управлять твоим массивом и обеспечить доступ к объекту этого класса из контекста скрипта.
А дальше из скрипта можно доставать значения используя arr.at( i, j ). |
|
|
BRE |
![]()
Сообщение
#23
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Пример:
array2d.h
array2d.cpp
main.cpp
Высокой скорости вычисления от скриптов ожидать не стоит (от нативной она будет сильно отличаться). |
|
|
BRE |
![]()
Сообщение
#24
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Пример:
array2d.h
array2d.cpp
main.cpp
Высокой скорости вычисления от скриптов ожидать не стоит (от нативной она будет сильно отличаться). |
|
|
Гость_Гость_AntonTatu_*_* |
![]()
Сообщение
#25
|
Гости ![]() |
Цитата Высокой скорости вычисления от скриптов ожидать не стоит (от нативной она будет сильно отличаться). спасибо, так то же попробывал..., очень медленно в 1000 раз на глазок если, вобщем вопрос не снят, каким образом можно из проги получать код и компилить его "нативно"....? я уже весь инет перелазил, ну не писать же собственный компилятор.... (для меня это не реально ![]() |
|
|
BRE |
![]()
Сообщение
#26
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
спасибо, так то же попробывал..., очень медленно в 1000 раз на глазок если, вобщем вопрос не снят, каким образом можно из проги получать код и компилить его "нативно"....? я уже весь инет перелазил, ну не писать же собственный компилятор.... (для меня это не реально ![]() Уточни, из каких операций будет состоять формула (+ - * /)? Или будут еще какие-то функции? Опиши подробней. Ты используешь 2-мерный массив, это не изображение часом, а формула - не фильтр ли? |
|
|
AntonTatu |
![]()
Сообщение
#27
|
Студент ![]() Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
спасибо, так то же попробывал..., очень медленно в 1000 раз на глазок если, вобщем вопрос не снят, каким образом можно из проги получать код и компилить его "нативно"....? я уже весь инет перелазил, ну не писать же собственный компилятор.... (для меня это не реально ![]() Уточни, из каких операций будет состоять формула (+ - * /)? Или будут еще какие-то функции? Опиши подробней. Ты используешь 2-мерный массив, это не изображение часом, а формула - не фильтр ли? все намного про ще, генерится специальным образом массив, считается формула такого вида: x[0,j]*x[2,j]*x[5,j]*x[10,j]+x[0,j]*x[3,j]*x[4,j]+N+..... формула считается в цикле, с каждой итерацией формула новая, ее длинна то же может изменится..., переменные в формуле это значения разных ячеек массива, на выходе каждой итерации необходимо получить расчетное значение итой формулы, колличество прогонов (итераций) миллионы.... ![]() |
|
|
BRE |
![]()
Сообщение
#28
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 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]+N+..... формула считается в цикле, с каждой итерацией формула новая, ее длинна то же может изменится..., переменные в формуле это значения разных ячеек массива, на выходе каждой итерации необходимо получить расчетное значение итой формулы, колличество прогонов (итераций) миллионы.... ![]() Возможно ли выделить из формулы одинаковые части, например x[0,j]*x[2,j]*x[5,j]*x[10,j] x[0,j]*x[3,j]*x[4,j] которые повторяются от формулы к формуле? |
|
|
trdm |
![]()
Сообщение
#29
|
Дмитрий Трошин ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 575 Регистрация: 12.1.2008 Пользователь №: 68 Спасибо сказали: 21 раз(а) Репутация: ![]() ![]() ![]() |
Может быть ассемблер?
![]() Данные то все числовые, компилятор небольшой ![]() |
|
|
SABROG |
![]()
Сообщение
#30
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Тогда можно глянуть на fasmlib.
|
|
|
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 |
|
|
BRE |
![]()
Сообщение
#41
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
static нужен для того, чтобы стек был один для всех операций. static раскомментируем. ![]() В исходник за описанием класса Operation добавляем строку:
В таком виде у меня все копилируется без ошибок. По функционированию посмотрю вечером, сейчас должен уехать по делам. ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#42
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
выражение слева от ".pop" должно представлять класс, структуру или объединение вот и убери лишнее слева, зачем тебе Operation::Для всех: Читайте тему Справка по кнопкам и тэгам форума |
|
|
AntonTatu |
![]()
Сообщение
#43
|
Студент ![]() Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
SABROG |
![]()
Сообщение
#44
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Как по скорости?
|
|
|
BRE |
![]()
Сообщение
#45
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Еще небольшое уточнение, насчет операций вычитания и деления:
Для сложения/умножения не принципиально. ![]() |
|
|
AntonTatu |
![]()
Сообщение
#46
|
Студент ![]() Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
BRE |
![]()
Сообщение
#47
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Как по скорости? на первый взгляд не плохо, наднях обязательно отпишусь... ![]() Погонял тесты, при замене QStack на std::stack, получил увеличение производительности больше чем в 12 раз. Раскрывающийся текст
|
|
|
AD |
![]()
Сообщение
#48
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
BRE |
![]()
Сообщение
#49
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Погонял тесты, при замене QStack на std::stack, получил увеличение производительности больше чем в 12 раз. Кстати, а почему так? С чем это связано? Пока не разбирался, сам в недоумении. ![]() Будем посмотреть... ![]() Посмотрел. QStack построен на базе QVector, и при добавлении/удалении элемента постоянно делает resize вектора. std::stack построен на std::deque, соответственно скорость добавления/удаления на высоте. Сообщение отредактировал BRE - 9.3.2009, 22:20 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#50
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Ребята подумайте как переименовать тему, я ее читаю вскользь. Вы лучше должны суть понимать, но название Как создать dll из собственной программы ? не отражает суть обсуждения.
|
|
|
AntonTatu |
![]()
Сообщение
#51
|
Студент ![]() Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 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 |
![]()
Сообщение
#52
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#53
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
SABROG |
![]()
Сообщение
#54
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
BRE |
![]()
Сообщение
#55
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
т.е. что бы появилась возможность "сдвигать" формулу и, не перестраивая формулу заново и не генерируя новый массив ? Ну барин ты задачки задаешь. (с) ![]() Переделать операцию VarOp или сделать еще одну операцию (это набросок).
Таким образом можно наделать разных необходимых операций, ввести переменные и т.д. Например, если у всех переменных необходимо изменять j, можно сделать такую операцию, которая это будет делать вызовом одной функции. Думай пробуй. ![]() |
|
|
AntonTatu |
![]()
Сообщение
#56
|
Студент ![]() Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Ну барин ты задачки задаешь. (с) ![]() ............................................. ............................................. Таким образом можно наделать разных необходимых операций, ввести переменные и т.д. Например, если у всех переменных необходимо изменять j, можно сделать такую операцию, которая это будет делать вызовом одной функции. Думай пробуй. ![]() Да у самого голова уже пухнет ![]() Последний вопрос связанный вот с этим , и все.... вот эта часть
как сделать так что бы при сложении если на стеке ( m_stack.push( v1 + v2 ) ![]() я сделал так.... вот
все работает как надо, но мне кажется что можно было както проще сделать ? Сообщение отредактировал AntonTatu - 11.3.2009, 0:21 |
|
|
BRE |
![]()
Сообщение
#57
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Мне кажется, что логичней, если сам метод run() будет сообщать нужно ли продолжать вычисления.
вот
Еще желательно ввести методы для очистки стека, т.к. при таком прерывании операции возможны случаи, когда в стеке останутся данные. Можно ввести такое понятие как контекст, в котором хранить арифметический стек, состояние (ошибка), исходные данные, локальные переменные. Тогда мы бы избавились от статического стека и получили возможность пихать расчет формул по разным потокам. Если будут еще вопросы задавай, мне самому интересен этот вопрос. ![]() Сообщение отредактировал BRE - 11.3.2009, 8:39 |
|
|
AntonTatu |
![]()
Сообщение
#58
|
Студент ![]() Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Мне кажется, что логичней, если сам метод run() будет сообщать нужно ли продолжать вычисления. Так и знал что можно было огород не городить......с флажком... ![]() Цитата Еще желательно ввести методы для очистки стека, т.к. при таком прерывании операции возможны случаи, когда в стеке останутся данные. сделал так: вот
Если выход из цикла будет по break, то в стэке будет какой то результат, но в этом случае очищать его мне ненужно, т.к., я его в дальнейшем использую... (мне его наооборот получать нужно ![]() Цитата Можно ввести такое понятие как контекст, в котором хранить арифметический стек, состояние (ошибка), исходные данные, локальные переменные. Тогда мы бы избавились от статического стека и получили возможность пихать расчет формул по разным потокам. Если будут еще вопросы задавай, мне самому интересен этот вопрос. ![]() вот это очень интересно, т.к. скорости мне все равно хочется больше... (если компилировать dll ку с массивом получается намного быстре, только компилятор таскать за собой не получится...) |
|
|
BRE |
![]()
Сообщение
#59
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
//Очищаем стэк перед новым расчетом //хотя заметил что перед новым расчетом стэк всегда пуст, даже если предыдущий выход из цикла был по брэйку...., //наверно и очищать его не нужно.... и функция лишняя... ? Вот смотри формула: 100 200 300 400 0 / * + + происходит ошибка: Деление на 0, в стеке: 100 200 300 400 Тут от формулы зависит. вот это очень интересно, т.к. скорости мне все равно хочется больше... (если компилировать dll ку с массивом получается намного быстре, только компилятор таскать за собой не получится...) С нативом даже не сравнивай, не расстраивай себя. Такой производительности не будет. ![]() Контексты набросаю чуть позже... |
|
|
BRE |
![]()
Сообщение
#60
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Добавил контексты.
Разбил по файлам. Кратко документировал. Проект в архиве.
Прикрепленные файлы
|
|
|
AntonTatu |
![]()
Сообщение
#61
|
Студент ![]() Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Добавил контексты. Разбил по файлам. Кратко документировал. Проект в архиве. ПАСИБА завтра буду вникать ! ![]() ЗЫ: что то попробовал открыть под Visual Studio, QT проект не подцепился, ошибку при открытии выдает, под Qt Creator ом, проект открылся только все что по русски написано не читается (кракозябы), пробовал FAR ом открыть он то же кодировку не понял (win, dos), под Linux-ом написано ? Сообщение отредактировал AntonTatu - 11.3.2009, 21:59 |
|
|
BRE |
![]()
Сообщение
#62
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
ЗЫ: что то попробовал открыть под Visual Studio, QT проект не подцепился, ошибку при открытии выдает, под Qt Creator ом, проект открылся только все что по русски написано не читается (кракозябы), пробовал FAR ом открыть он то же кодировку не понял (win, dos), под Linux-ом написано ? UTF8 В QtCreator: Edit -> Select encoding... -> UTF-8 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 28.7.2025, 21:05 |