Что нового

Как уменьшить количество RAM занимаемой приложением AutoIt

erlik

Продвинутый
Сообщения
317
Репутация
84
Поясню: во многих языках есть сборщики мусора, которые чистят память занимаемую процессом от неиспользуемых данных. Работает ли сборщик мусора в AutoIT?
У меня приложение занимает в памяти 20 мб - хотелось бы как то уменьшить эту цифру.
Когда я писал приложения на C# (который сторонники "плюсов" нередко обвиняли ресурсоемкости), то легко добивался снижения расхода ресурсов комбинацией использования сборщика мусора и метода WinAPI SetProcessWorkingSetSize
Попробовал его применить в AutoIT (за отсутствием сборщика мусора - только его)
Код:
Func FlushMemory()
$hProcess= DllCall("kernel32.dll", "ptr", "GetCurrentProcess") ; получим хендел текущего процесс
DllCall("kernel32.dll", "int", "SetProcessWorkingSetSize", "ptr", $hProcess, "int",-1, "int",-1); ужмем его рабочее пространство
EndFunc

Но эффекта не получил - хотя в шарповских приложениях эффект был 2-10 кратный.
Возможно, что в данном случае неправильно использовал данный метод.
Кто-нибудь дать пояснения на эту тему и рассказать какие есть еще варианты по уменьшению расхода оперативной памяти?
---------------------------------------------------------------------------------
Нашел в WinAPIEx.au3 функцию _WinAPI_EmptyWorkingSet() - уменьшила память вдвое. Неплохо. Однако SetProcessWorkingSetSize была все таки эффективней...
---------------------------------------------------------------------------------
Однако все гораздо лучше, если поставить вызов _WinAPI_EmptyWorkingSet на таймер:
объем занимаемой памяти уменьшился почти в 20 раз! :ok:
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
erlik, приведи пример :smile: вместе порадуемся :smile:
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
Ну что там приводить? Все банально.
Код:
#include <WinAPIEx.au3>
AdlibRegister ( "_FlushMemory", 2000)
Func _FlushMemory()
_WinAPI_EmptyWorkingSet()
EndFunc

Было 20 мб - стало 1.2 mb.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
erlik, чудес не бывает, почитай здесь. Если какое-либо приложение выделело для себя память, то освободить ее может только само приложение. _WinAPI_EmptyWorkingSet() просто свопит все, что может.
 
Верх