• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Отимизация Scriptlib'ов

  • Автор темы Omh
  • Дата начала
O

Omh

Вот и всплыл Omh с очередной задачей, котоая ему не под силу.

Разросся мой монстр (программулина для всего под лотусъ) до неприличных размеров.
64 библиотеки, сильно залинкованые, можно сказать, 10-ти уровневая хиерархия.

В связи с этим, начали притормаживать ф-ии вызываемые из библиотек верхних уровней.
Сразу скажу, на Initialize нигде ничего нету.
Тормозит из-за того, что много библиотек подлючено через Use.
Все биб-ки LS, никаких джав.
Парочка библиотек примерно по 200 кб
Остальные меньше.
Средний размер, думаю килобайт 50-70...

Вопрос прост: что делать?

Сокращать кол-во бибиотек, наращивая размер?
Увеличивать кол-во библиотек, сокращая размер?
Не юзать библиотеки, а по 100 раз декларить одни и те же ф-ии под кнопками/агентами? :lol:

Заранее спасибо!
 
M

morpheus

возможно имеет смісл использовать динамические библиотеки ? ( Execute )

что там ещё... использование Replace(Get)ItemVAlue вместо прямого обращения

Иногда мне кажеться чем подгружать тяжолуюю библиотеку в другую из-за 1 нужной ф-ции можно эту ф-цию продублировать в тек. LSLib и юзес не ставить ...
 
K

Kee_Keekkenen

единственный вариант использовать только то, что нужно в текущем приложении, если конечно, там не все имеющееся используется ..
 
O

Omh

Да, я тут уже немного раздробил одну тяжёлую библиотеку.
И вот в планах заюзать Execute.
Оказывается, если объект обьявлен глобально, то он виден и внутри, и вне Execut'a.
Что, в принципе, логично, но не совсем прозрачно :)
 

Murtas

Green Team
11.04.2006
137
1
BIT
4
1. сомневаюсь, что использование вложенности из 10-ти уровней библиотек везде нужно ... разбивай на 2, 3 уровня и плоди еще больше библиотек
2. местами попробуй заинклюдить lss файлы сделанные из наиболее не изменяемых библиотек
3. Execute тоже хорошая весч, но подключение аналогичного набора (например полного) библиотек будет еще медленнее чем есть). Динамически оно на то и хорошо - только тогда когда надо.
 
K

K-Fire

Не так давно прочитал в буржуйском блоге. У человека была точно такая же проблема, куча кода, куча либ. Путем экспериментов было выяснено что если объединить весь код (там у него это было 300кб) в одну библиотеку, то тормоза практически исчезают. Попробуйте сделать так же и нам напишите, проверим насколько там верная инфа :)

Думаю что еще можно попробовать варианты:
- Вырезать текст из библиотеки (или проще вынести текст во внешнюю лсс-ку).
- Если в либах есть классы, то попробовать перекомпоновать либы (т.е. что-то вынести, что-то внести, как-то упростить наследование). Мне помогло однажды.
- про Execute уже писали, но там надо быть крайне аккуратным, недавно наткнулся на странный баг, в клиенте вызываемый через Execute код отрабатывал на ура, на сервере падал, т.к. не мог найти некую вызываемую функцию, которая была определена во вложенных библиотеках. Когда вручную добавил нужную либу, все заработало. Клиент 7.0.3.
 
O

Omh

C Execute я уже попробовал.
Результат довольно удручающий: тот выигрыш времени, который появляется за счёт использования Execute, и, соответсвенно, без загрузки библиотеки, потом компенсируется 3-х кратными тормозами при подгрузке этой библиотеки в Execute.

Пока я сделал вот что: убрал лишние Use.

На примере:
у нас есть Lib1, Lib2, Lib3
Lib1 - допустим, ErrorHandler
Lib2, Lib3 - обычные библиотеки
Так вот, если в Lib3 уже юзается библиотека Lib2 (которая в свою очередь использует Lib1), то в Lib3 не надо подключать Lib1.
При 3-х библиотеках это, я думаю, будет не заметно, но вот при 63-ёх выигрыш примерно в 3-4 раза.
Пропадают тормоза на пустом месте, типа "нажал кнопку и сидишь".

Правда, это немного усложняет разработку: если поменял Use промежуточной библиотеки, то надо проверить Use всего, что выше, но, повторюсь, выигрыш есть и заметный.
Тем более, что я это дело хочу автоматизировать.
Сделать волшебную кнопку "Optimize ScriptLibraries" :)
 
A

Akupaka

самое первое то, к чему ты уже пришел - лишние USE, т.к. при этом лотус подгружает код, линкует его, проверяет нет ли его уже в памяти (личное мнение) и при множественных лишних USE это отнимает больше всего времени...

по организации библиотек, если у тебя есть три библиотеки: Л1, Л2, Л3, которые организованы примерно Л3 use Л2 use Л1, то скорее всего их объединение не даст особого прироста, но кроме того, каждая из этих библиотек может содержать свои особые функции, которые могут быть использованы в других местах, но без потребности подгрузки библиотек более высокого уровня, т.е. какая-то Л4 use Л2, бо то, что находится в Л3 ей не нужно. Соответственно, в тех местах где это не нужно, нужно уменьшать уровень используемой библиотеки. т.е. если кнопка на форме не юзает функции из Л3, то лучше чтобы она тянула только Л2...
кроме этого, следует провести анализ используемости функций и реорганизовать библиотеки вообще, т.е. поперемещать какие-то функции в другие либы, чтобы из-за них не подгружать лишний код, например, если Л3 содержит 50 функций, и только Ф10 вызывается из нее в формах, то следует задуматься о переносе Ф10 в Л2, либо в Л1...

надеюсь понятно выразился :) все это ах... очень большой объем работы :)

могу попробовать нарыть одну функцию, возможно она будет полезной, в ней проводился анализ инструкций Use, и формировалось дерево библиотек (компилятор свой писал)... скинь мне в личку свой контакт, я постараюсь не забыть отослать :)
 
O

Omh

Уже всё сделано.
Написал модуль, который анализирует use в библиотеках и выдаёт иерархию.
При этом выдаёт список лишних юзов, анализирую их после пострения иерархии.

Ну и на сладкое убирает автоматом лишние юзы (через DXL)

Энивей, спасибо за предложение.
 
O

Omh

Ну в том виде в котором она уже реализована, выкладывать к сожалению, не могу.
Но есть у меня идея сделать махонький проектик по лотусу, глядишь, там и выложу с открытым кодом и т.д.
Но это чуть позже.
 
A

Akupaka

надеюсь, что эта идея будет реализована, а не останется отложенной из-за постоянных задач и т.п. :)
 
N

nor

Omh

Уважаемый, Omh!!! Общественность ждет! Почему не выкладываете свой тул по анализу либов?? Пожалуйста, многим будет интересен ваш тул!
 
O

Omh

Потому что не могу выкроить время и выдрать этот модуль отдельно из программы.
А тот тул, который я когда-то выкладывал, и, собственно, частью которого является этот анализатор библиотек, уже не могу выложить по коммерческим соображениям.
Вот такие пироги :(

Надо сесть и сделать LITE версию, которую и смогу спокойно выкладывать в общий доступ.
Но пока, к сожалению, не до этого.

Как только жареный петух клюнет в жэпу, займусь :rolleyes:
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
все что здесь предлагается очень похоже на "расширение" либлоадера в джава, только "законными" методами :p
может не UI библы на джава переписать ;) ?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!