Arbeitsspeicheranforderung zur Laufzeit reduzieren

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Arbeitsspeicheranforderung zur Laufzeit reduzieren

Beitrag von Lewi »

Hi Folks,

ich habe die Demo von SmartGC getestet und festgestellt, das Tool verspricht mehr als es hält. Jedenfalls konnte ich bei einer unserer Anwendung ( 32 MB Exe-file inkl DLLs) keine Verbesserung des Speicherverhaltens feststellen.

Martin hat mich darauf aufmerksam gemacht hat, dass der Speicherbedarf einer Anwendung sich reduzieren lässt, wenn die Anwedung minimiert und anschließend wieder maximiert wird.

Ich habe das getestet und folgende Funktion „ClearMem() innerhalb einer Anwendung implementiert:

Code: Alles auswählen

DLLFUNCTION GetForegroundWindow()               USING STDCALL FROM USER32.DLL 
DLLFUNCTION ShowWindow( nHwnd, nCmdShow )       USING STDCALL FROM USER32.DLL 

Func ClearMem()
Local nHandle := GetForegroundWindow()
	ShowWindow( nHandle, SW_MINIMIZE )
	ShowWindow( nHandle, SW_RESTORE )
Return ( NIL 
Inerhalb der Main-Procedur wird dann diese Funktion aufgerufen. Dadurch reduziert sich der Speicherbedarf bei einer unseren Anwendung von ursprünglich ca. 31 MB unter 5 MB!
Soweit so gut.

Ich bin bei MSDN auf folgendes API-Funktion gestoßen: SetProcessWorkingSetSize.

Näheres dazu unter:
http://msdn.microsoft.com/library/defau ... etsize.asp
http://support.microsoft.com/?scid=kb;EN-US;293215

Wenn ich das richtig verstanden habe, kann über diese API-Funktion analog zum Minimize/Maximize Speicher freigegeben werden. Nur, auf Basis der nachfolgenden Funktion funktioniert es bei mir nicht:

Code: Alles auswählen

DLLFUNCTION SetProcessWorkingSetSize( nPid, nMin, nMax ) USING STDCALL FROM KERNEL32.DLL
DLLFUNCTION GetWindowThreadProcessId( nForgroundHwnd, @nRetProcId ) USING STDCALL FROM USER32.DLL
DLLFUNCTION GetForegroundWindow()               USING STDCALL FROM USER32.DLL

Procedure main
....
Clearmem2()
....
Return 

Func ClearMem2()
	Local nHandle := GetForegroundWindow()
	Local nPID
	nPid := GetWindowThreadProcessId( nHandle, 0)
	SetProcessWorkingSetSize( nPid, -1, -1  )

Return ( NIL )
Ich das auch mit Dephi versucht [ (SetProcessWorkingSetSize(GetCurrentProcess, Cardinal(-1), Cardinal(-1)) ], auch ohne Ergebnis.

Habe ich etwas übersehen oder eignet sich die API-Funktion nicht dafür?

Gruß, Olaf
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Olaf.

Fenster minimieren und maximieren kann man auch mit Xbase-Bordmitteln:

Code: Alles auswählen

oDialog:SetFrameState(XBPDLG_FRAMESTAT_MINIMIZED)
oDialog:SetFrameState(XBPDLG_FRAMESTAT_MAXIMIZED)
Davon abgesehen, wie ich bereits schrub: Ich halte es für nicht sehr aussagekräftig, sich auf die Speicherauslastungsangaben des Taskmanagers zu beziehen. Wenn ich den jetzt gerade laufenden Browser (Netscape 8 ) minimiere, sinkt die Speicherauslastung gemäß TM von 21 auf 1 MB, nach dem Maximieren steigt sie auf 8 MB an. Der Effekt beruht auf der Tatsache, daß Windows von einer minimierten Anwendung beanspruchten Speicherplatz auslagert und anderen Anwendungen zur Verfügung stellt. Gerade jetzt liegt der angezeigte Speicherbedarf bei 30 MB. Die Systematik des Minimize-Maximize hat lediglich kosmetischen Wert, tatsächlich dürfte sie die Applikation schlimmstenfalls verlangsamen, da das Auslagern von beanspruchten Speicherseiten physikalische Zugriff auf die Festplatte nötig macht, die naturgemäß deutlich langsamer sind als RAM-Zugriffe.

Deine Versuche mit SetProcessWorkingSetSize halte ich für bedenklich, da sie in die Speicherverwaltung der Xbase-Runtime (VM, MM) einzugreifen versuchen, was günstigstenfalls scheitert, schlimmstenfalls Crashes verursacht.
Herzlich,
Tom
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hallo Tom,
die Idee mit xBase-Bordmitteln die Applikation zu minimieren hatte ich auch. Aber über diesen Weg bleibt die Hauptspeicherauslastung unberührt. Erst über die API-Funktion tritt der Effekt ein.

Deiner Argumentation, das die Systematik minimize/maximize lediglich kosmetischen Wert hat, vermag ich mich nicht anzuschließen.

Nehmen wir das Beispiel des Programms Alaska-Programms ImageView. Bei der Anzeige von großen JPG-Files steigt der Hautspeicherbedarf. Wie mit dem Taskmanager und auch über den Prozess-Explorer ( das Freeware-Programm) festzustellen ist, steigt ebenfalls der für die Anwendung reservierte virtuelle Speicher. Bei der Anzeige von ca. 1 MB großen Images steigt der RAM-Bedaf dramatisch an (bei mir sind es ca. 70 MB).

Mit einem „Minimize“ reduziert sich der RAM-Bedarf auf unter 1 MB. Das Betriebssystem lagert wohl bis auf die „Basiskomponenten“ wie z.B. Timer, Eventverarbeitung, Laufzeitbibliotheken etc. alles andere aus und gibt den Hauptspeicher für andere Anwendungen frei.

Was im Falle von ImageView wohl sicher anzunehmen ist, hat der Speicherzuwachs bei der Anzeige großer Image-Files wohl nichts damit zu tun, dass ein ständiges Nachladen von Programmcode die Ursache für den steigenden RAM-Bedarf ist. Der Grund liegt wohl eher darin, dass zur bildlichen Umsetzung von JPG-File-Daten jede Menge Speicherblöcke alloziert werden. Aus welchen Gründen auch immer, schafft es der Garbage Collector von xbase nicht, diese allozierten Adressräume wieder freizugeben. Erst ein „minimize“ scheint wohl den Speicher aufzuräumen bzw. zu optimieren. Dein Argument, es wird zwar Speicher freigegeben, aber Code ausgelagert darf angesichts der 70 MB Speicherreduzierung nach einem Minimize in Zusammenhang mit ImageView bezweifelt werden.
Deine Versuche mit SetProcessWorkingSetSize halte ich für bedenklich, da sie in die Speicherverwaltung der Xbase-Runtime (VM, MM) einzugreifen versuchen, was günstigstenfalls scheitert, schlimmstenfalls Crashes verursacht.
Nun, ich denke nicht, dass mit dieser API-Funktion auf die Speicherverwaltung innerhalb des xbase runtimes Einfluß genommen wird. Mit SetProcessWorkingSetSize() kann man das Minimum und das Maximum des WorkingSets für einen Prozess betriebssystemseitig bestimmen und dadurch die Performance erheblich beeinflussen. Ist das WorkingSet zu hoch, dann nimmt man anderen Prozessen quasi Speicher weg. Ist er zu klein, kann sich die Anwendung durch das Paging stark verlangsamen. ( siehe Infos in der MSDN zu SetProcessWorkingSetSize() )

Im Übrigen möchte ich durch die Werte -1, -1 lediglich den Speicher „aufräumen“, unter Umgehung eines minmize/maximize.

Meine ursprüngliche Frage steht weiterhin im Raum. Warum funktioniert das bei mir nicht?
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

auf meiner Prof. Sub. gibt es eine Datei memwatch.dll (hlp), welche man nutzen kann um zu überwachen wie der Speicher genutzt und wieder freigegeben wird.
Gruß
Hubert
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Moin!
Ich habe keine Sub.Prof.
Hat denn diese DLL irgend welche Effekte?

Gruß, Olaf
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Moin Olaf,

memwatch.dll müßte aber auf der Alaska Homepage liegen. Ich habe die Datei auch und ich habe nur eine einfache Subscription.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hi Manfred,
vielen Dank für den Hinweis!

Gruß, Olaf

PS: So ein Forum hat schon sein Gutes ;-)
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

Sie war als ZIP in den zipped files. Vielleicht auch bei der normalen ?

Sie zeigt nur an, was belegt wird, und ob das dann auch wieder ordnungsgemäß freigegeben wird. Sucht also 'Speicherlöcher'.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Jup,
auf der Homepage von Alaska ist sie nicht!
Meine Version ist von 2003, Version 1.82.294 und liegt im Verzeichnis XPPW32\LIB (nicht im Runtime!!!) - die Doku dazu im Verzeichnis XPPW32\BOOK.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hm,

meine ist von 2001.

Jetzt weiß ich auch nicht mehr so genau, woher ich die habe. Aber ich habe sie.

Im Verzeichnis sind noch:
advprof.prg
calls.prg
first.prg
hold.prg
init.prg
multi.prg
prfhold.prg

ich vermute mal, es war wohl dann eine Beigabe bei den PRG Files.
Auf jeden Fall sind die PRG von Alaska....
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
mini990
1000 working lines a day
1000 working lines a day
Beiträge: 592
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
Danksagung erhalten: 1 Mal

Beitrag von mini990 »

die DLL ist auch bei der 1.9 RC2 enthalten (im LIB-Verzeichnis)

Gruß Stefan
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Mist, ich bin wohl hier der Einzige, der im Regen steht. Ich finde die DLL auf meinem Rechner nicht..... Werde wohl den letzten Sub.-Download ausfindig machen müssen.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Nö,

bist Du nicht.

ich finde die DLL auch nicht da, wo sie angeblich sein soll.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

also auf der Prof. Sub. CD 5

befinden sich 2 Ordner:

\MEMWATCH\ <- mit den einzelnen Dateien
\ZIP\MEMWATCH.ZIP <- als Archiv

beide werden NICHT mitinstalliert !
Man kann diese selbst installieren, indem man die ZIP in XPPW32 mit Pfaden entpackt.

Mehr weiß ich auch nicht.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Beitrag von Jan »

Wenn ich ich richtig erinnere ist das ein separater Download. ich hab das Ding zu Hause auf dem Rechner, leide nicht hier. Kann also heute Mittag drauf zugreifen.

Jan
Antworten