Конференция "KOL" » что можно сделать с отжираемым объемом памяти?
 
  • Barloggg (17.03.08 11:11) [0]
    есть программа.
    создает applet.

    формы нет. больших объемов данных нет.
    файл 90 кб.
    в оперативке занимает 3-4 мб. откуда?
    работает с десятком-другим коротких динамических массивов и битмапом размерами 200х50 точек. ну, с канвой конечно. да еще и stream для загрузки из файла.

    я так полагаю это работа менеждера памяти и эти мегабайты запас для скорости. значит нужен другой менеджер памяти?
    из найденных только fastmm который заточен на скорость за счет памяти, что не подходит по определению и менеджер от thaddy который эффекта не дал (если я правильно понял инструкции ясно дело).

    или подобная вещь типична для дельфей вообще и не лечится?

    а ведь в диспетчере задач висят процессы у который использование оперативки и 100 кб и 50кб.
    я тоже так хочу!
  • AndreyRus © (21.03.08 03:38) [1]
    ^
  • Vadim Petrov (22.03.08 21:45) [2]
    ну, где-то так
    uses Windows, SysUtils;

    procedure TrimWorkingSet;
    var
     MainHandle: THandle;
    begin
     if Win32Platform = VER_PLATFORM_WIN32_NT then
     begin
       MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID);
       SetProcessWorkingSetSize(MainHandle, DWORD(-1), DWORD(-1));
       CloseHandle(MainHandle);
     end;
    end;

  • Andrey_rus (23.03.08 11:57) [3]

    > ну, где-то так

    Лучше так, одной строкой -     SetProcessWorkingSetSize(GetCurrentProcess, DWORD(-1), DWORD(-1));

    Но это все самообман. Приложение на КОЛ действительно "кушает" памяти гораздо больше чем аналогичное на чистом WinApi. Здесь нужно серьезно разбираться...
  • Elec3C © (23.03.08 16:06) [4]

    > я тоже так хочу!

    с

    > работает с десятком-другим коротких динамических массивов
    > и битмапом размерами 200х50 точек. ну, с канвой конечно.
    >  да еще и stream для загрузки из файла.

    ты хочешь чтобы прога занимала 100 кб? Каким то образом, а?
  • Barloggg (24.03.08 10:28) [5]
    ну, малость поизучал это дело

    пустое консольное приложение где текста один единственный readln занимает 900 кб. без замены системных файлов.

    добавление NewApplet доводит уровень оперативки до 1.6 мб.
    тогда я подумал, может дело в ООП? и прикола ради решил переписать один модуль без использования ООП, то есть глобальный динамический массив и вложенные record и сравнил с тем же модулем, но на вложенных object.
    результат получился одинаковым!
    решил покосить на строки, ведь это же массивы и под них динамически выделяется память.
    тогда заменил string на shortstring результат получился неоднозначным: shortstring в модуле без ООП добавил 400кб оперативки, а в модуле с ООП не дал разницы.
    гм.

    про SetProcessWorkingSetSize(GetCurrentProcess, DWORD(-1), DWORD(-1)); спасибо, посмотрю

    мне от программы нужен его хендл и обработка принятых сообщений, но мне не нужно больше ничего визуального. я так полагаю придется все равно создать окно и сделать его невидимым.
  • lse (24.03.08 13:06) [6]
    А ты посмотри какие длл грузятся вместе с приложением. Например, такой код:
    program tiny;
    uses kol;
    begin
     MsgOk('1');
    end.
    на винте занимает 14Кб, в памяти 44кб, далее список длл:
    - ntdll.dll - 0.7Mb
    - kernel32.dll - 1.0 Mb
    - User32.dll - 0.6 Mb
    - Gdi32.dll - 284 Kb
    - Advapi32.dll - 0.7 Mb
    - Rpcrt4.dll - 0.6 Mb
    - Secur32.dll - 68 Kb
    - Uxtheme.dll - 224 Kb
    - Msvcrt.dll - 352 Kb
    - Msctf.dll - 300 Kb
    итого около 2Мб.
  • =BuckLr= © (24.03.08 15:13) [7]

    > итого около 2Мб.

    Большинство dll во время старта программы будут уже загружены. Так что нам они ничем не мешают
  • Barloggg (24.03.08 16:09) [8]
    кстати еще посмотрел в сторону выделения памяти под что-то командой компилятора {$M 0,0} (что-то такое) и прога не запустилась :) поигрался со значениям, но эффекта тоже не получил.
  • Тыщ (24.03.08 18:38) [9]
    > а ведь в диспетчере задач висят процессы у который использование оперативки и 100 кб и 50кб.

    Среди обычных программ там что-нибудь есть? Или только сервисы и ntvdm?

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

    Создавай окно с hWndParent = HWND_MESSAGE, может, поможет сэкономить ресурсов.

    > кстати еще посмотрел в сторону выделения памяти под что-то командой компилятора {$M 0,0}

    Не издевайся над стеком. Все равно под него память только резервируется, а не выделяется, а если резерв закончится, Windows просто прибъет твою прогу без всяких сообщений.

    А вообще lse [6] правильную мысль высказал.
  • Vadim Petrov (24.03.08 21:03) [10]
    Господа, вообще говоря, этот вопрос уже здесь обсуждался, и даже неоднократно.
    Вкратце, объем памяти показываемый в диспетчере НЕ СООТВЕТСТВУЕТ реальной физической памяти, выделенной процессу.
    Хотите, чтобы в диспетчере отображались меньшие цифры? Используйте
    SetProcessWorkingSetSize

    Что касается использования GetCurrentProcess, то на мой взгляд, сделать CloseHandle идеологически вернее. ИМХО. Все ж таки не на JAVA или C# пишем.
    Не стоит расслабляться даже в мелочах.
  • KOLBoss © (25.03.08 04:36) [11]

    > Vadim Petrov   [10]

    А что разве
    GetCurrentProcess

    открывает какойто
    Handle

    ?
 
Конференция "KOL" » что можно сделать с отжираемым объемом памяти?
Есть новые Нет новых   [134431   +15][b:0][p:0.001]