Alternative zu AllocateMemory

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Alternative zu AllocateMemory

Beitrag von Helle »

Wenn´s im Programm
- Speicher zu reservieren gilt,
- mal wieder auf jede Micro-Sekunde ankommt,
- eigentlich nicht nötig ist, den reservierten Speicher mit Nullen zu füllen,
können nachfolgende API-Funktionen genutzt werden:

Code: Alles auswählen

;- Alternative zu AllocateMemory(), für Speicher-Bedarf bis 500KB; ab hier greifen andere Mechanismen
;- Der reservierte Speicher wird zur Zeit-Einsparung nicht mit Nullen aufgefüllt
;- "Helle" Klaus Helbing, 08.09.2007, PB4.02
;- Die Variante über Handle einen Pointer zu ermitteln wird allgemein favorisiert
;- Local oder Global spielt keine Rolle
;- Für Strings beachten: Das End-Zero-Byte ist bei Bedarf selbst zu setzen!

;- Version mit AllocateMemory() von PB
For m=10000 To 1010000 Step 50000
 TA=ElapsedMilliseconds() 
  For z=1 To 25000
   pMem=AllocateMemory(m)    ;das Bekannte

  ;Code

   FreeMemory(pMem)          ;für Testschleife, erledigt zum Programm-Ende PB selbst 
  Next z
 TE=ElapsedMilliseconds()-TA
 Mess1$+Str(m)+" Bytes : "+Str(TE)+" ms"+#LFCR$
Next m
;---------------------------------------------------------------------------------------------
;- Version mit API über Handle; Parameter 2 = nicht mit Nullen auffüllen, 66 = auffüllen
;- Weitere Parameter bleiben hier unberücksichtigt
For m=10000 To 1010000 Step 50000
 TA=ElapsedMilliseconds() 
  For z=1 To 25000
   hMem=LocalAlloc_(2,m)     ;zuerst Handle ermitteln, hier auch Test auf Null (Gültigkeit)
   pMem=LocalLock_(hMem)     ;Speicher-Bereich fixieren und Pointer auf Speicher-Beginn 

   ;Code

   LocalUnlock_(hMem)        ;zum Ende des Programmes alles wieder freigeben    
   LocalFree_(hMem)
  Next z
 TE=ElapsedMilliseconds()-TA
 Mess2$+Str(m)+" Bytes : "+Str(TE)+" ms"+#LFCR$
Next m
;---------------------------------------------------------------------------------------------
MessageRequester("Speicher reservieren", "PB : "+#LFCR$+Mess1$+#LFCR$+"API :  "+#LFCR$+Mess2$)
;---------------------------------------------------------------------------------------------
Der Test kann einige Sekunden dauern!

Gruss
Helle