Что нового

Посоветуйте по оптимизации

The Dream

Новичок
Сообщения
393
Репутация
3
Всем привет, всем привет, это единственны форум на котором я когда либо я так долго проводил время. Ну ладно, перейду к теме.

Посоветуйте пожалуйста ребята, как оптимизировать скрипт. Есть главный скрипт, и есть дочерний. Интересует именно дочерний. У меня есть своя udf, где со временем все больше и больше ф-ций (так и именуется: MyFunc.au3). Ну и со временем это отразилось на запуске скрипта - он уже запускается 2-3 секунды, а если одновременно запускаются 5-8 дочерних процессов, то это перерастает в 10-12 секунд.

Возможно ли как-то сделать, чтобы из MyFunc.au3 скрипт брал только то, что будет использовать. Или это невозможно? Если нет, то думаю что буду в дочернем скрипте не использовать MyFunc.au3.

Ф-ций не так много в моей udf, но и подключаемых udf - тоже много и все они требуются.

Во всех скриптах вначале стоит:

#include <MyFunc.au3>

И вот не совсем еще понял про #include-once.. :whistle:


Добавлено:
Сообщение автоматически объединено:

И подскажите, стоит ли вообще не сжимать *.exe для его более быстрого запуска?
 

erlik

Продвинутый
Сообщения
317
Репутация
84
Возможно ли как-то сделать, чтобы из MyFunc.au3 скрипт брал только то, что будет использовать
Использовать обфускатор (если не возникает критических ошибок при его применении) и его директивы для удаления неиспользованных данных.
Код:
#Obfuscator_Parameters= /StripOnly /ObfuscateMinumum ; параметры подберешь сам - смотри справку.

Но это вроде актуально только для скомпилированного скрипта (или все таки нет?).
Может тогда просто не стоит пихать все в одну MyFunc.au3, а раскидать по модулям согласно функционалу?
#include-once нужно использовать всегда.
чтобы избежать включения файлов более одного раза.
Первой директивой перед списком UDF.
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
erlik немного не понял, но все же интересно про "обусфакцию". Это ведь вроде защита.. ? Но вряд ли она мне нужна, скрипт используется в скомпилированном варианте.

#include-once не использую, и не совсем понимаю для чего это :stars:

Может тоже потому что сонный :scratch:
 

erlik

Продвинутый
Сообщения
317
Репутация
84
dream.reckless
В том то и дело, что обфускация это защита от 'дурака'. То есть никакая не защита, и поэтому годится только для целей минимизации кода.
Если не использовать #include-once, то UDF, которые сплошь и рядом используют другие\пересекающиеся UDF, будут добавлять в твой скрипт UDF, которые уже добавлены тобой или другой UDF. :smile:
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
erlik, у меня в коде только одна UDF - MyFunc.au3 и все, а в ней уже все udf и ф-ции.

Пожалуйста, напиши подробнее про #include-once и как использовать... :-[


Добавлено:
Сообщение автоматически объединено:

К сожалению пришел к следующему выводу - что лучше всего это самому извлекать все ф-ции из используемых UDF, это в крайнем случае, в том когда невозможно написать свое решение. А так - писать свое решение (ф-цию). Именно таким методом я могу добиться минимальное время запуска процесса от старта до работы первой ф-ции.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Про #include-once попытаюсь объяснить...
У нас есть главный скрипт и две UDF.
В этих двух UDF, скажем, есть переменные, константы и функции которые нужны главному скрипту.
И пример главного скрипта
Код:
#include <udf1.au3>
#include <second_udf.au3>
MsgBox(0, "Сообщение из главного скрипта", "Это "&@ScriptName)


Теперь перейдём к первой UDF.
Она в своей работе тоже использует вторую UDF и также её подключает.
Она не знает, подключает ли пользователь сначало первую, а потом вторую, она этого не может знать...
Но вторую подключить надо и она её подключает, так как она нужна.
Что у нас получается с первой:
Код:
#include-once
#include <second_udf.au3>
MsgBox(0, "Сообщение из скрипта первой udf", "Это первая подключаемая UDF."&@CRLF&"Меня использует главный скрипт и вторая UDF. Они меня могут подключать два или более раз но если использовать #include-once я выполнюсь всего один раз...")


Во второй UDF будет вот такое :smile:
Код:
#include-once
#include <udf1.au3>
MsgBox(0, "Сообщение из скрипта второй udf", "Это вторая подключаемая UDF. Я не знаю будут ли первую подключать пользователь, но мне она нужна для работы. Я её подключаю. Пользователь, возможно, не знает что вмести со мной подключается первая (или для наглядности) и получается что в коде как-бы написано"&@CRLF&"#include <udf1.au3>"&@CRLF&"#include <udf1.au3>"&@CRLF&"А если использовать #include-once то код собирётся таким:"&@CRLF&"#include <udf1.au3>"&@CRLF&"И всё.")


Если запустить главный скрипт то при использовании #include-once первой и второй UDF код собирётся и получится таким:
Код:
#include-once
MsgBox(0, "Сообщение из скрипта второй udf", "Это вторая подключаемая UDF. Я не знаю будут ли первую подключать пользователь, но мне она нужна для работы. Я её подключаю. Пользователь, возможно, не знает что вмести со мной подключается первая (или для наглядности) и получается что в коде как-бы написано"&@CRLF&"#include <udf1.au3>"&@CRLF&"#include <udf1.au3>"&@CRLF&"А если использовать #include-once то код собирётся таким:"&@CRLF&"#include <udf1.au3>"&@CRLF&"И всё.")
#include-once
MsgBox(0, "Сообщение из скрипта первой udf", "Это первая подключаемая UDF."&@CRLF&"Меня использует главный скрипт и вторая UDF. Они меня могут подключать два или более раз но если использовать #include-once я выполнюсь всего один раз...")
#include <udf1.au3>
#include <second_udf.au3>
MsgBox(0, "Сообщение из главного скрипта", "Это "&@ScriptName)


Для понятности на 200% я собрал архив с этими скриптами. Скачайте и запустите main.au3. Попробуйте поэксперементировать и убрать #include-once и посмотреть что получится.
inc_once.zip


Вот так про include надо было объяснить... :smile: :smile: :smile:
InnI сказал(а):
Представьте следующее: когда вы запускаете скрипт, строка с #include заменяется на содержимое указанного файла. Т.е. именно в то место, где находится строка, будет "вставлен" целиком файл. Получается, что вы запускаете один большой скрипт, где вместо каждой #include вставлены указанные файлы.
 

erlik

Продвинутый
Сообщения
317
Репутация
84
dream.reckless
пришел к следующему выводу - что лучше всего это самому извлекать все ф-ции из используемых UDF
Я тоже раньше так делал. Но это был геморой, приходилось отслеживать все связи извлекаемой функции с константами и другими функциями и тоже их добавлять. Поэтому годится только для мелких автономных функций. К тому же потом мне объяснили, что это мягко говоря, не очень умно, так как обфускатор умеет все это делать автоматически. Да, c ним бывают проблемы, о чем он сам, как правило, предупреждает, но можно использовать дополнительные директивы
Код:
#Obfuscator_Off ;Остановить процесс обфускации ниже этой строки 
здесь какой то код, который вызывает проблемы при обфускации
#Obfuscator_On ;Начать процесс обфускации ниже этой строки

Либо использовать другие, менее жесткие параметры обфускации в основной директиве
#Obfuscator_Parameters, добавить какие то функции или переменные в исключения.
Код:
#Obfuscator_Ignore_Funcs=имя функции,имя функции; Не обрабатывать указанные функции 
#Obfuscator_Ignore_Variables= имя переменной,имя переменной; Не обрабатывать указанные переменные
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
alex33

Спасибо большое!, то есть #include-once должен быть в каждом скрипте, верно?

erlik, так получается что обусфактор задуман не только для превращения кода в кашу, чтобы мол его не декомпи.. а и для оптимизации кода? Просто не знал :scratch:


Добавлено:
Сообщение автоматически объединено:

И что думаете по этому поводу?

"И подскажите, стоит ли вообще не сжимать *.exe для его более быстрого запуска?"
 

erlik

Продвинутый
Сообщения
317
Репутация
84
dream.reckless
Ты насчет UPX? Ну дак разница в запуске между упакованным и неупакованным скриптом весьма условна и некритична. Так что думай сам - нужно тебе или нет. Я upx всегда использую. Процентов на 10-20 код сжимает и то ладно: exe -шник уже не таким огромным кажется в сравнении ... ну понятно с чем. :smile:


Добавлено:
Сообщение автоматически объединено:

И еще к тому ж скорость запуска твоей проги зависит от того, чем ты ее нагружаешь перед отображением GUI. Можно ведь сначала GUI отобразаить, а потом уже вычисления какие то сделать: списки там заполнить, массивы заполнить и т.д.
 

_dron_

Знающий
Сообщения
84
Репутация
8
Ты насчет UPX? Ну дак разница в запуске между упакованным и неупакованным скриптом весьма условна и некритична.

нет не условна!!! скорость запуска падает на 4% (на пару тысячных секунды)!!!
у UPX есть плюсы
1) программа занимает меньше места (но zip или rar еще не отменяли)
2) есть возможность предотвратить распаковку *exe на диск upx'ом (но это нужно делать ручками)
3) все ресурсы сжаты и скрипт в том числе (только последняя версия AutoIt) и если использован 2 вариант то декомпиляция скрипта затруднительна (это будет стоить 500-1000$) имхо дешевле попросить у автора скрип за те же 200$
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
erlik, спасибо, буду экспериментировать и позже отпишусь..


Добавлено:
Сообщение автоматически объединено:

Да, ребята, вы - правы! :laugh:

Не знаю правда все же почему - ведь скрипту требуются необходимое время и ресурсы для распаковки. Ведь так?


Добавлено:
Сообщение автоматически объединено:

Разнице небольшая, но существенная. То есть так лучше. Почему - мне так и не понятно..
 
Верх