WinMobile: программа занимает много памяти

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

zusicks438
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 26.12.2008 (Пт) 20:16

WinMobile: программа занимает много памяти

Сообщение zusicks438 » 06.11.2009 (Пт) 16:41

Когда пишешь для компьютера, еще не так заметно. А тут...

Написал первую программу на .NET (до этого писал только на VB6), причем сразу для PPC (собственно, только для этого и стал .NET учить). Так она весит 11,5 КБ, а в оперативке занимает 775 КБ :shock:

Почему так и можно ли как-то этот объем уменьшить? Я конечно слышал, что .NET программы занимают столько памяти. Но не до такой же степени.

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: WinMobile: программа занимает много памяти

Сообщение Joo » 07.11.2009 (Сб) 6:34

zusicks438 писал(а):Когда пишешь для компьютера, еще не так заметно. А тут...

Написал первую программу на .NET (до этого писал только на VB6), причем сразу для PPC (собственно, только для этого и стал .NET учить). Так она весит 11,5 КБ, а в оперативке занимает 775 КБ :shock:

Почему так и можно ли как-то этот объем уменьшить? Я конечно слышал, что .NET программы занимают столько памяти. Но не до такой же степени.


Фактически .NET программы не занимают столько памяти, а лишь резервируют её, и освободят по первому требованию системы.
Например в Windows .Net прога "пустая" резервирует ~20 метров при 1 гигабайте оперативке, а если 3 гига оперативы то уже ~50 метров. Опять же в Windows есть хитрый способ освободить, или как там правильно сказать, зарезервированную память и "пустая" уже занимает 150-200Kb в не зависимости от объема оперативки. Не знаю под WinMobile прокатит такое или нет, но я бы не парился по этому поводу.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: WinMobile: программа занимает много памяти

Сообщение Joo » 07.11.2009 (Сб) 6:45

Вот так это работает в .NET под Windows

Код: Выделить всё
    Private Sub Form_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        AddHandler Application.Idle, AddressOf FlushMemory
    End Sub

    Private Sub FlushMemory()
        If System.Environment.OSVersion.Platform = PlatformID.Win32NT Then
            SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1)
        End If
    End Sub
   
    <DllImport("kernel32.dll")> _
    Public Shared Function SetProcessWorkingSetSize(ByVal handle As IntPtr, ByVal minimumWorkingSetSize As Integer, ByVal maximumWorkingSetSize As Integer) As Boolean
    End Function
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

773FF
Обычный пользователь
Обычный пользователь
 
Сообщения: 86
Зарегистрирован: 07.02.2008 (Чт) 10:51

Re: WinMobile: программа занимает много памяти

Сообщение 773FF » 07.11.2009 (Сб) 18:21

Очень интересно, формально память не экономит, но ведь продвинутые пользователи так дёргаются, когда программа отжирает 15-20 МБ и это только частный набор. СПАСИБО.
А проблем после этого трюка не возникает?

773FF
Обычный пользователь
Обычный пользователь
 
Сообщения: 86
Зарегистрирован: 07.02.2008 (Чт) 10:51

Re: WinMobile: программа занимает много памяти

Сообщение 773FF » 07.11.2009 (Сб) 19:30

Вкурил мануалы: SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1) в общем-то освобождает память за счёт перекидывания данных в файл подкачки. От этого может упасть производительность приложения. Но если приложение выполняет не очень сложную задачу, то в принципе можно так экономить ОЗУ или по крайней мере утешить пользователей вашего Win32NT приложения.

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: WinMobile: программа занимает много памяти

Сообщение Joo » 08.11.2009 (Вс) 6:17

773FF писал(а):Вкурил мануалы: SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1) в общем-то освобождает память за счёт перекидывания данных в файл подкачки. От этого может упасть производительность приложения. Но если приложение выполняет не очень сложную задачу, то в принципе можно так экономить ОЗУ или по крайней мере утешить пользователей вашего Win32NT приложения.


Раскуривал правильно?

Вольный пересказ писал(а):Функция используется для установки процессу нужного объема оперативной памяти, которая по возможности не будет сбрасываться в файл подкачки. Указав вторым и третьим параметром значение -1 будет обеспечен программе рабочий минимум ОЗУ без сброса в своп.


Думаю смысл понятен.

Вот еще:
С сайта gotdotnet писал(а):Вопрос:
Почему моя программа занимает столько памяти?

Ответ:
На самом деле, это не память, реально «отъедаемая» вашим приложением, а так называемое «рабочее множество» (working set; такой перевод устоялся довольно давно). Рабочее множество – термин из теории операционных систем, и означает он совокупность страниц памяти, используемых процессом в стационарном состоянии. То есть, проще выражаясь, это память, отложенная процессом «про запас». Вообще говоря, как правило большинство приложений не использует все свое рабочее множество, оно устанавливается операционной системой при запуске «на глазок» (упрощенно конечно), а если приложение требует больше памяти, рабочее множество автоматически расширяется. Расширение рабочего множества – довольно длительная операция, поэтому в большинстве случаев целесообразно оставлять его с запасом, что операционная система и делает.

Однако, если вам действительно нужно, чтобы приложение в памяти было «незаметно», есть возможность урезать свое рабочее множество вручную. К сожалению, сделать это можно только прибегнув к Win32 API, к конкретно – к функции SetProcessWorkingSetSize:

Первый параметр – это хендл процесса, который можно получить из System.Diagnostics.Process.GetCurrentProcess().Handle, а второй и третий параметр – это соответственно минимальный и максимальный размер рабочего множества. Понятно, что рассчитывать нужные размеры – задача та еще, поэтому функция имеет один приятный сервис: если в качестве второго и третьего параметра указать -1 (минус единицу), операционная система сама посчитает, какие размеры нужны вашему приложению и установит рабочее множество по минимуму.


Если не будешь считать "ручакми" сколько надо памяти то свопинга не будет!
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

773FF
Обычный пользователь
Обычный пользователь
 
Сообщения: 86
Зарегистрирован: 07.02.2008 (Чт) 10:51

Re: WinMobile: программа занимает много памяти

Сообщение 773FF » 09.11.2009 (Пн) 18:30

Понятно, что рассчитывать нужные размеры – задача та еще, поэтому функция имеет один приятный сервис: если в качестве второго и третьего параметра указать -1 (минус единицу), операционная система сама посчитает, какие размеры нужны вашему приложению и установит рабочее множество по минимуму.

Спасибо, видимо я не ту траву вкуривал.
Кстати эффект от SetProcessWorkingSetSize потрясающий, "частный рабочий набор" моего приложения в диспетчере задач снизился с 15 МБ до 512 КБ!


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 87

    TopList