| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > VB6 > Как уменьшить размер программы |
| Автор: Walera 14.5.2006, 05:45 |
| Суть вопроса токова какие есть способы и приемы для уменьшения размера программы в оперативной памяти. |
| Автор: Тутанхамец 14.5.2006, 08:39 |
| Только VB-шные способы из книжки: - компилируй в p-код. В "Свойствах", меню "Проект". - уменьшай число загруженных форм, а те, которые больше не нужны, сразу выгружай (unload, а не hide) - уменьшение числа элементов управления, использование массивов элменетов управления - использование label вместо TextBox (или не использование TextBox вместо Label) - храни данные (картинки, например) в файлах, а не в exeшнике. - организация модулей (модуль подгружается в память только по требованию, а так лежит себе на диске) - не юзай тип variant без нужды - юзай динамические массивы, а не статические - вовремя уничтожай объекты и строки (s$="") - юзай условную компиляцию (чтоб избавиться от своих процедур, которые нужны только во время отладки) - картинки и графические методы занимают много памяти - для простого отображения юзай Image, а не PictureBox - если картинка не нужна, выкидывай ее (типа set form1.picture=nothing) - для отображения на формах лучше юзать метод PaintPicture, а не Image или PaintBox Ну и наконец последнее, не вэбэшное: юзай компрессоры типа UPX или ASP (хотя я на вэбэшных прогах это не пробовал). |
| Автор: Naghual 15.5.2006, 09:11 |
| А вопрос был в уменьшении размера исполняемого файла либо в уменьшении объема занимаемой оперативной памяти? |
| Автор: HAS 15.5.2006, 18:27 |
| Naghual, оперативной памяти. |
| Автор: Naghual 15.5.2006, 18:58 |
| А! Ну да! Туплю я чего-то... |
| Автор: Walera 16.5.2006, 05:19 | ||
Как уменьшить размер вот этого кода
|
| Автор: Naghual 16.5.2006, 09:06 |
| Уменьшить размер кода??? Установи мелкий шрифт!!! Код нельзя уменьшить! Иногда возможно его оптимизировать с конкретной целью. Иногда после этого исходного кода становится меньше. Но это не может быть задачей. Это мое личное мнение. |
| Автор: IcyJet 16.5.2006, 20:45 | ||
И товарищи, разумно используйте масивы элементов управления!
Согласен, к этому особо стремится ненадо, но раздувать его тоже нестоет. А вобще если смущает большой код(хотя этот я неназову большим), тогда можно делать модули. В один к примеру объявления API'шки и процедур-оболочкек, в другом еще что-то и т. д. |
| Автор: Walera 17.5.2006, 05:53 | ||
Эта программы занимает в оперативной памяти 3,2 Мб у меня всего оперативной памяти 96 Мб и установлен WinXP Поэтому свободной памяти почти не остается. А вопрос состоит в том можно ли объем занимаемый программой оперативной памяти уменьшить до 1 - 1,,5 Мб |
| Автор: Тутанхамец 17.5.2006, 08:20 |
| Из этой трехмеговой программы ты показал нам одну функцию, которая на три мега явно не тянет. И хочешь какого-то ответа? Уж не говоря о том, что подсказка - это подсказка, а работу за тебя делать никто не будет (по крайней мере бесплатно). Ну и бесплатный совет Добавлено @ 08:31 А вообще мне стало интересно... Ответил сейчас и для пробы запустил свою простенькую программку, которая практически не использует ни массивы, ни графику, ни много элементов управления... считает только по формуле. В общем, должна быть легкая. Экзешник 44 кб. Посмотрел в Диспетчере Задач - ее процесс занимает 6 мегов. Виртуальная машина VB и прочие dll? Раньше не задумывался, так как не ставил ХР на слабых машинах. Запустил прогу, сделанную в Делфи на WinAPI (41 kb). Процесс весит 2 мега. Вот думаю сейчас - почему так: - библиотеки объем дают? - или винда выделяет больше места, чем надо? Для стека целый мегабайт вроде по умолчанию... Уважаемые, кто может просветить? |
| Автор: Тутанхамец 17.5.2006, 08:54 | ||
Walera, извини. Был не прав. Видимо, тянет Добавлено @ 09:05 Сейчас посмотрел модули, загруженные для самой простенькой VBшной проги: Проект1.exe ntdll.dll kernel32.dll MSVBVM60.DLL USER32.dll GDI32.dll ADVAPI32.dll RPCRT4.dll ole32.dll msvcrt.dll OLEAUT32.dll uxtheme.dll MSCTF.dll SXS.DLL SSSensor.dll Насколько понимаю - они размер и дают. Я прав, народ? Или модули dll должны быть одни для всех процессов и на размер каждого не влияют? |
| Автор: IcyJet 17.5.2006, 15:38 | ||
Ну есть модули dll общие почти для всех програм (а-ля USER32.dll, GDI32.dll, kernel32.dll и т.д.), и почти для каждого высоко уравневого языка (для нашего любимого к примеру MSVBVM60.DLL), ты прав они и дают рАзмер...
ActiviX DLL сама по себе не запускается (ты знаеш |
| Автор: Walera 18.5.2006, 05:28 | ||
да во время отладки эта функция вешает систему напрочь, но готовый ЕХЕ проект на работу системы ни как не оказывает влияние. ( покрайней мере на таймауте в 10 секунд) при использовании DoEvents индикатор использования ресурсов процессора просто зашкаливает, а так как программа доджна сидить от включения компьютера до его выключения второй способ меня не устраивает Данная функция не моя родная. из всего кода чисто моё это только функция Мain, а за совет СПАСИБО, анлогично всем участникам. |
| Автор: Тутанхамец 18.5.2006, 07:36 | ||||
А что входит? Если смотреть размер процесса в Диспетчере Задач? Akina, я вот вчера попробовал порыться насчет модулей процесса. Нарыл примерно то же самое в книжке Стивена Романа "Программ-е в Win32 API на VB":
Но тогда вопрос - а как узнать, сколько физической памяти занимает мой Проект1.exe? В списке модулей, если получать его через EnumProcessModules, присутствуют и "автономные" и "общие". GetModuleInfo, насколько я понимаю, дает размер image'а в обоих случаях. Есть какой-то апишный способ, чтобы различить автономные и общие? Или нужно пересчитывать все модули во всех процессах, ища те, которые по одному разу? И если как-нибудь разобраться, сколько занимают модули, то есть ведь еще и стек и, может, еще какая-нибудь фигня, относящаяся к процессу? С этим как быть? Картинку виртуального адресного пространства я нашел в упомянутой книжке, но интересует физически. |
| Автор: Akina 18.5.2006, 11:24 | ||
Конечно нет. Есть возможность определить твой процесс вызвал его (модуля) загрузку или он и раньше мотался в памяти - посмотреть дерево парентов процессов от исполняемого файла. Но пойми правильно - если некие общие модули не были загружены ранее, то при загрузке первый раз системе потребуется выделить больше памяти чем после выхода и повторной загрузки - ну и какую из цифирей считать "потреблением"? Добавлено @ 11:25 Полюбопытствуй что выводит скажем процессэксплорер Руссиновича - он в первом приближении дает иерархию... построить такую несложно, как и анализировать. |
| Автор: Walera 19.5.2006, 05:02 | ||
Мне бы хотелось еще узнать почему код
работает не коректно. в результате его выполнения программа Schetchik запускается, но не работает если Schetchik запускать через автозапуск или через проводник то все нормально. Почему? |
| Автор: Naghual 19.5.2006, 08:48 |
| А может быть проблема в Schetchik.exe? |
| Автор: Тутанхамец 19.5.2006, 16:32 | ||||
Да, в ПроцессЭксплорере это как-то нагляднее... В общем, с процессами всё не так просто, как я думал до этой темы.
Хорошо, что пока нет необходимости. Спасибо, Акина. |
| Автор: Walera 20.5.2006, 05:02 |
Нет, если его запускать через проводник программа работает без проблем. Без проблем она работает если ее поместить в автозапуск, а через Shell она не работает. единственное что я заметил так это то что она вся не разворачивается и если верить диспетчеру задач то весит всего 1,5 Мб при 4,5 Мб в нормальном режиме на счет экспортируемых модулей самой простой программе достаточно только модуля MSVBVM60.dll. MSVBVM60.dll при работе экспортирует себе: kernel32 гser32 ntdll gdi32 advapi32 ole32 loeaut32 rpcrt4 msvcrt вот это и есть минимально загружаемый список модулей |
| Автор: Тутанхамец 20.5.2006, 08:36 | ||||||
Возможно, разница возникает из-за того, что, как тут уже не раз говорилось, dll в памяти бывают автономные и общие? Твоя вызывающая программа подгружает их, а счетчик пользуется. А иначе ему самому приходится их подгружать, если они еще не загружены...
А как он должен работать? Так или иначе, надо счетчик смотреть. Если он запускается, то с Shell, имхо, спроса нет.
Может твой счетчик просто не умеет работать, когда isconnected?.. Неправильно, скажем, юзает подключение. Если есть исходный код счетчика, посмотри что там происходит. Пусть он при работе, скажем, выводит в файл - типа "загрузился", "выгрузился", "сделал то", "сделал это" и т.п. |
| Автор: Walera 22.5.2006, 05:28 |
| Ура, проблема решена. Счетчик работает нормально все дело было в Shell, если не указывать второй параметр данной функции, то программа запускается в скрытом режиме, следовательно я ее не вижу и по этому решил что программа не работает. Всем спасибо. Добавлено @ 05:30 Да кстати в скрытом режиме программа занимает в 2-3 раза меньше памяти чем в обычном. |
| Автор: Тутанхамец 22.5.2006, 06:23 | ||
Хотя тема и закрыта, я всё равно добавлю. Просто я особо раньше не думал над этим, а тут заинтересовался.
Запустил шесть блокнотов. Размеры в диспетчере задач разные. У шестого был приблизительно 700 kb, а у первого 2 гига с чем-то. Начал их убирать. При удалении одного процесса меняется (увеличивается) размер других. |