Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как уменьшить размер программы 
V
    Опции темы
Walera
Дата 14.5.2006, 05:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Суть вопроса токова какие есть способы и приемы для уменьшения размера программы в оперативной памяти.  
PM MAIL   Вверх
Тутанхамец
Дата 14.5.2006, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: 4
Всего: 6



Только VB-шные способы из книжки:

- компилируй в p-код. В "Свойствах", меню "Проект". 

- уменьшай число загруженных форм, а те, которые больше не нужны, сразу выгружай (unload, а не hide)

- уменьшение числа элементов управления, использование массивов элменетов управления

- использование label вместо TextBox (или не использование TextBox вместо Label)

- храни данные (картинки, например) в файлах, а не в exeшнике. 

- организация модулей (модуль подгружается в память только по требованию, а так лежит себе на диске)

- не юзай тип variant без нужды

- юзай динамические массивы, а не статические

- вовремя уничтожай объекты и строки (s$="")

- юзай условную компиляцию (чтоб избавиться от своих процедур, которые нужны только во время отладки)

- картинки и графические методы занимают много памяти

- для простого отображения юзай Image, а не PictureBox

- если картинка не нужна, выкидывай ее (типа set form1.picture=nothing)

- для отображения на формах лучше юзать метод PaintPicture, а не Image или PaintBox

Ну и наконец последнее, не вэбэшное: юзай компрессоры типа UPX или ASP (хотя я на вэбэшных прогах это не пробовал).

  

Это сообщение отредактировал(а) Тутанхамец - 14.5.2006, 08:39
PM MAIL   Вверх
Naghual
Дата 15.5.2006, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



А вопрос был в уменьшении размера исполняемого файла либо в уменьшении объема занимаемой оперативной памяти?
 


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
HAS
Дата 15.5.2006, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ing
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 1.3.2005
Где: Internet

Репутация: нет
Всего: 2



Naghual, оперативной памяти. smile  
PM MAIL   Вверх
Naghual
Дата 15.5.2006, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



А! Ну да!
Туплю я чего-то...
 smile  


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
Walera
Дата 16.5.2006, 05:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Как уменьшить размер вот  этого кода
Код

Attribute VB_Name = "MdlMonitor"
' АПИ для связи
Private Declare Function RasEnumConnections Lib "RasApi32.dll" Alias "RasEnumConnectionsA" (lpRasCon As Any, lpcb As Long, lpcConnections As Long) As Long
Private Declare Function RasGetConnectStatus Lib "RasApi32.dll" Alias "RasGetConnectStatusA" (ByVal hRasCon As Long, lpStatus As Any) As Long
Private Const RAS95_MaxEntryName = 256
Private Const RAS95_MaxDeviceType = 16
Private Const RAS95_MaxDeviceName = 32
Private Type RASCONN95
    dwSize As Long
    hRasCon As Long
    szEntryName(RAS95_MaxEntryName) As Byte
    szDeviceType(RAS95_MaxDeviceType) As Byte
    szDeviceName(RAS95_MaxDeviceName) As Byte
End Type
Private Type RASCONNSTATUS95
    dwSize As Long
    RasConnState As Long
    dwError As Long
    szDeviceType(RAS95_MaxDeviceType) As Byte
    szDeviceName(RAS95_MaxDeviceName) As Byte
End Type
'Задержка
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'получение данных
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

Private Function IniStringPrivate(SekName As String, KeyName As String) As String
'Читает строковый параметр из любого файла .INI
'-------------------------------------------------
'SekName - имя секции (регистр не учитывается)
'KeyName - имя ключа (регистр не учитывается)
'"Нет ключа"    - возвращаемое функцией значение, если ключ не найден
'IniFileName - имя файла .ini (если путь к файлу не указан,файл ищется в папке Windows)

Dim sTemp As String * 256 'строковый буфер(под значение ключа)
Dim nTemp As Integer 'в неё запишется количество символов в строке ключа
Dim IniFileName As String
IniFileName = App.Path & "\Data.ini"

nTemp = GetPrivateProfileString(SekName, KeyName, "Нет ключа", sTemp, 255, IniFileName)
IniStringPrivate = Left$(sTemp, nTemp)
'ограничение - параметр не может быть больше 255 символов
End Function


Private Function IsConnected() As Boolean
    Dim TRasCon(255) As RASCONN95
    Dim lg As Long
    Dim lpcon As Long
    Dim RetVal As Long
    Dim Tstatus As RASCONNSTATUS95
    TRasCon(0).dwSize = 412
    lg = 256 * TRasCon(0).dwSize
    RetVal = RasEnumConnections(TRasCon(0), lg, lpcon)
    Tstatus.dwSize = 160
    RetVal = RasGetConnectStatus(TRasCon(0).hRasCon, Tstatus)
    If Tstatus.RasConnState = &H2000 Then
        IsConnected = True
    Else
        IsConnected = False
    End If
    'Set TRasCon() = Nothing
    'Set lg = Nothing
    'Set lpcon = Nothing
    'Set RetVal = Nothing
    'Set Tstatus = Nothing
End Function

Sub Main()
Dim InterwalInet As Long
Dim status As Boolean
status = False
InterwalInet = Val(IniStringPrivate("General", "IntervalInet"))
Do
Sleep InterwalInet
If IsConnected Then
    If Not status Then
        status = True
        Shell App.Path & "\Schetchik.exe"
    End If
Else
     If status Then
        status = False
     End If
End If
Loop
End Sub

 
PM MAIL   Вверх
Naghual
Дата 16.5.2006, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



Уменьшить размер кода???
Установи мелкий шрифт!!!

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

Это мое личное мнение.  

Это сообщение отредактировал(а) Naghual - 16.5.2006, 09:06


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
IcyJet
Дата 16.5.2006, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



И товарищи, разумно используйте масивы элементов управления! smile 

Цитата

Код нельзя уменьшить!


Согласен, к этому особо стремится ненадо, но раздувать его тоже нестоет.
А вобще если смущает большой код(хотя этот я неназову большим), тогда можно делать модули.
В один к примеру объявления API'шки и процедур-оболочкек, в другом еще что-то и т. д. 
PM MAIL   Вверх
Walera
Дата 17.5.2006, 05:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Цитата

Код нельзя уменьшить!


Эта программы занимает в оперативной памяти 3,2 Мб у меня всего оперативной памяти 96 Мб и установлен WinXP Поэтому свободной памяти почти не остается. А вопрос состоит в том можно ли объем занимаемый программой оперативной памяти уменьшить до 1 - 1,,5 Мб 
PM MAIL   Вверх
Тутанхамец
Дата 17.5.2006, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: 4
Всего: 6



Из этой трехмеговой программы ты показал нам одну функцию, которая на три мега явно не тянет. И хочешь какого-то ответа? 

Уж не говоря о том, что подсказка - это подсказка, а работу за тебя делать никто не будет (по крайней мере бесплатно).

Ну и бесплатный совет smile : насколько я помню при юзании Sleep сообщения не обрабатываются. Прога как бы подвисает. При больших таймаутах это выглядит неприглядно. Возможно, таймер или DoEvents было бы лучше.

Добавлено @ 08:31 
А вообще мне стало интересно... Ответил сейчас и для пробы запустил свою простенькую программку, которая практически не использует ни массивы, ни графику, ни много элементов управления... считает только по формуле. В общем, должна быть легкая. Экзешник 44 кб. Посмотрел в Диспетчере Задач - ее процесс занимает 6 мегов. Виртуальная машина VB и прочие dll? Раньше не задумывался, так как не ставил ХР на слабых машинах. 

Запустил прогу, сделанную в Делфи на WinAPI (41 kb). Процесс весит 2 мега. Вот думаю сейчас - почему так:

- библиотеки объем дают?

- или винда выделяет больше места, чем надо? Для стека целый мегабайт вроде по умолчанию...

Уважаемые, кто может просветить? 
PM MAIL   Вверх
Тутанхамец
Дата 17.5.2006, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: 4
Всего: 6



Цитата

Из этой трехмеговой программы ты показал нам одну функцию, которая на три мега явно не тянет.


Walera, извини. Был не прав. Видимо, тянет smile И еще как видимо.

Добавлено @ 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 должны быть одни для всех процессов и на размер каждого не влияют? 
PM MAIL   Вверх
IcyJet
Дата 17.5.2006, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Ну есть модули dll общие почти для всех програм (а-ля USER32.dll, GDI32.dll, kernel32.dll и т.д.), и почти для каждого высоко уравневого языка (для нашего любимого к примеру MSVBVM60.DLL), ты прав они и дают рАзмер...
Цитата

... модули dll должны быть одни для всех процессов и на размер каждого не влияют

ActiviX DLL сама по себе не запускается (ты знаеш smile ), по этому любой процесс который ее хочит использовать должен грузить в СВОЮ память, это не ActiviX EXE... 
PM MAIL   Вверх
Akina
Дата 17.5.2006, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Walera

А на зачем ты объявляешь массив на 256 элементов (строка 48)
Код
Dim TRasCon(255) As RASCONN95

если потом используешь только TRasCon(0)?

Объяви переменную, а не массив.

Добавлено @ 16:46 
Цитата(Тутанхамец @  17.5.2006,  09:54 Найти цитируемый пост)
Или модули dll должны быть одни для всех процессов и на размер каждого не влияют?  

Именно... если это первое использование DLL - она будет загружена и соответственно отъест памяти, но в любом случае размер DLL не входит в размер памяти, который потребляется самой программой. 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Walera
Дата 18.5.2006, 05:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Цитата

насколько я помню при юзании Sleep сообщения не обрабатываются. Прога как бы подвисает. При больших таймаутах это выглядит неприглядно. Возможно, таймер или DoEvents было бы лучше.


да во время отладки эта функция вешает систему напрочь, но готовый ЕХЕ проект на работу системы ни как не оказывает влияние. ( покрайней мере на таймауте в 10 секунд) 
при использовании DoEvents  индикатор использования ресурсов процессора просто зашкаливает, а так как программа доджна сидить от включения компьютера до его выключения второй способ меня не устраивает

Цитата(Akina @  17.5.2006,  16:42 Найти цитируемый пост)
А на зачем ты объявляешь массив на 256 элементов (строка 48)

 
Данная функция не моя родная. из всего кода чисто моё это только функция Мain, а за совет СПАСИБО, анлогично всем участникам. 
PM MAIL   Вверх
Тутанхамец
Дата 18.5.2006, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: 4
Всего: 6



Цитата

Именно... если это первое использование DLL - она будет загружена и соответственно отъест памяти, но в любом случае размер DLL не входит в размер памяти, который потребляется самой программой.  


А что входит? Если смотреть размер процесса в Диспетчере Задач?

Akina, я вот вчера попробовал порыться насчет модулей процесса. Нарыл примерно то же самое в книжке Стивена Романа "Программ-е в Win32 API на VB":

Цитата

...следует отметить особо, что эта область (памяти) может включать как автономные (unshared), так и совместно используемые файлы. Например, DLL, относящиеся к приложению Designer (на рис.), похоже, используются независимо (пок ане выполняются другие экземпляры этого приложения). Системные DLL, такие как KERNEL32.DLL, используются совместно, так как в физической памяти присутствует только одна копия каждой из них. Как праивло, эта копия отображается на одни и те же виртуальные адреса каждогоп роцесса, но это необязательно...


Но тогда вопрос - а как узнать, сколько физической памяти занимает мой Проект1.exe?

В списке модулей, если получать его через EnumProcessModules, присутствуют и "автономные" и "общие". GetModuleInfo, насколько я понимаю, дает размер image'а в обоих случаях. Есть какой-то апишный способ, чтобы различить автономные и общие? Или нужно пересчитывать все модули во всех процессах, ища те, которые по одному разу?

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

Это сообщение отредактировал(а) Тутанхамец - 18.5.2006, 07:39
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0868 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.