Bin bei der arbeit mit einer UDF darauf gestoßen das Globale variablen die die gleichen Daten tragen anscheinend von Autoit nicht erneut in den Speicher geschrieben werden, sondern wohl möglich nur einen Pointer bekommen.
Beispiel.
1. Ich Erstelle ein test datensatz von 1 MB
2. Ich schreibe diese per Assign in 1000 verschiedene globale variablen. Immer den selben datensatz.
3. prüfe danach ob die variablen auch wirklich die daten tragen die sie sollen
4. prüfe mit ProcessGetStats() wie der RAM verbrauch ist
und stelle fest
Vor dem schreiben: 15.3 MB
nach dem schreiben: 15.7 MB
Und das obwohl 1 GB an daten vorhanden sind und auch ohne probleme ausgelesen werden können.
#NoTrayIcon
#include "_storageS_UDF.au3"
#include <Array.au3>
#include <WinAPIConv.au3>
Local $hTimer = 0, $nTime = 0, $sData = "", $nMemBefore = 0, $nMemAfter = 0, $sCheckData = ""
; create test data set
ConsoleWrite("Creating test Data set of 1 MB" & @CRLF)
For $i = 1 To 1048576
$sData &= String(Random(0, 9, 1))
Next
ConsoleWrite("Created Data set" & @CRLF & @CRLF)
$nMemBefore = ProcessGetStats(@AutoItPID)[0]
ConsoleWrite("Writing 1 MB 1000 Times to 1000 different global variables" & @CRLF)
$hTimer = TimerInit()
For $i = 1 To 1000
_storageG_Overwrite(123, $i, $sData)
Next
$nTime = TimerDiff($hTimer)
ConsoleWrite("Write took: " & $nTime & " ms" & @CRLF & @CRLF)
$nMemAfter = ProcessGetStats(@AutoItPID)[0]
ConsoleWrite("Checking all variables for if the Data is correct" & @CRLF)
For $i = 1 To 1000
$sCheckData = _storageG_Read(123, $i)
if $sCheckData <> $sData Then
ConsoleWrite("Data at variable: " & $i & " is wrong" & @CRLF)
EndIf
Next
ConsoleWrite("Check done" & @CRLF & @CRLF)
ConsoleWrite("Mem Stats" & @CRLF & "Started at: " & _WinAPI_StrFormatByteSize($nMemBefore) & @CRLF & "Ended at: " & _WinAPI_StrFormatByteSize($nMemAfter) & @CRLF)
Alles anzeigen
Jetzt verändere ich den Test
1. Ich Erstelle ein test datensatz von 1 MB
2. Ich schreibe diese per Assign in 1000 verschiedene globale variablen und füge dem datensatz noch $i hinzu
3. prüfe danach ob die variablen auch wirklich die daten tragen die sie sollen
4. prüfe mit ProcessGetStats() wie der RAM verbrauch ist
und stelle jetzt fest
Vor dem schreiben: 15.3 MB
nach dem schreiben: 1,97 GB
#NoTrayIcon
#include "_storageS_UDF.au3"
#include <Array.au3>
#include <WinAPIConv.au3>
Local $hTimer = 0, $nTime = 0, $sData = "", $nMemBefore = 0, $nMemAfter = 0, $sCheckData = ""
; create test data set
ConsoleWrite("Creating test Data set of 1 MB" & @CRLF)
For $i = 1 To 1048576
$sData &= String(Random(0, 9, 1))
Next
ConsoleWrite("Created Data set" & @CRLF & @CRLF)
$nMemBefore = ProcessGetStats(@AutoItPID)[0]
ConsoleWrite("Writing 1 MB 1000 Times to 1000 different global variables" & @CRLF)
$hTimer = TimerInit()
For $i = 1 To 1000
_storageG_Overwrite(123, $i, $sData & $i)
Next
$nTime = TimerDiff($hTimer)
ConsoleWrite("Write took: " & $nTime & " ms" & @CRLF & @CRLF)
$nMemAfter = ProcessGetStats(@AutoItPID)[0]
ConsoleWrite("Checking all variables for if the Data is correct" & @CRLF)
For $i = 1 To 1000
$sCheckData = _storageG_Read(123, $i)
if $sCheckData <> $sData & $i Then
ConsoleWrite("Data at variable: " & $i & " is wrong" & @CRLF)
EndIf
Next
ConsoleWrite("Check done" & @CRLF & @CRLF)
ConsoleWrite("Mem Stats" & @CRLF & "Started at: " & _WinAPI_StrFormatByteSize($nMemBefore) & @CRLF & "Ended at: " & _WinAPI_StrFormatByteSize($nMemAfter) & @CRLF)
Alles anzeigen
Ich fand das interessant zu sehen, ist mir so vorher noch nicht aufgefallen. Vielleicht findet ihr das auch interessant. Deshalb der Post.
UDF gibts im Anhang oder hier zum selbst probieren: https://github.com/OfficialLambdax/_storageS-UDF