- Offizieller Beitrag
Hallo,
Folgendes Problem: Ich baue gerade ein Wireshark ähnlichen Sniffer der die Daten die an die Netzwerkkarten gesendet werden in realtime entpackt. Allerdings gibt es in dem Programm auch eine Speicher und Öffnen funktion. Ich habe selbst den PCAP Standard mir angeeignet und schreibe und lese die PCAP files also nun mit einer eigenen Routine via FileWrite/FileRead.
Läuft soweit alles gut. Nun steh ich vor folgendem Problem: PCAP Dateien können unglaublich groß sein. Also dacht ich mir, schreibe ich sie nur Teilweise in RAM und lese dann immer das aus was ich gerade brauche, doch zuvor wollte ich sicherheitshalber noch ein Test machen: Ist das überhaupt schneller?
Der Test sieht wie folgt aus:
Test A
Die Daten werden mit FileRead eingelesen => Jedes mal wenn ich neue Daten brauche muss FileRead aufgerufen werden
Test B
Die Daten werden komplett in ein Buffer geschrieben => Jedes mal wenn ich neue Daten brauche kann ich mit BinaryMid mir die stelle raussuchen.
Nun das verwunderliche: Mit dem Buffer zu arbeiten ist bei mir weitaus langsamer als mit FileRead.
z.B. für eine 9mb große Datei dauert die variante mit FileRead und nem buffer von nem kb auf einem Testlaptop 169ms, die Buffer methode liegt bei 30735ms
Jemand eine Idee woran es liegt? Hier mal ein Code zum Austesten.. Speichert die FileOpen funktion auch ziwschen? Falls ja, kann man da den Buffer irgendwie verändern?
Spoiler anzeigen
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Change2CUI=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;BufferSize, ggf. ändern
Local Const $iBufferSize = 1024; 1kb
Local Const $sFilename = FileOpenDialog("","","all (*.*)")
if @error Then Exit
Local $iFileSize = FileGetSize($sFilename)
;Test mit wiederholtem aufrum von FileRead
Local $hTestTimer = TimerInit()
Local $hTest = FileOpen($sFilename,16)
Local $iBytesRead = 0, $bTestWrite
Do
$bTestWrite &= FileRead($hTest,$iBufferSize)
$iBytesRead += @extended
Until $iBytesRead >= $iFileSize
FileClose($hTest)
[/autoit] [autoit][/autoit] [autoit]ConsoleWrite("FileRead: "&TimerDiff($hTestTimer) & @LF)
ConsoleWrite("Bytes Read: "&$iBytesRead & @LF)
;Test: Einmal wird der Buffer geschrieben, und dann mit BinaryMid die Daten beareitet
[/autoit] [autoit][/autoit] [autoit]Local $hTestTimer = TimerInit()
Local $hTest = FileOpen($sFilename,16)
$bBuffer = FileRead($hTest)
[/autoit] [autoit][/autoit] [autoit]Local $iBytesRead = 0, $bTestWrite = ""
Do
$bTestWrite &= BinaryMid($bBuffer,$iBytesRead + 1, $iBufferSize)
$iBytesRead += $iBufferSize
Until $iBytesRead >= $iFileSize
FileClose($hTest)
[/autoit] [autoit][/autoit] [autoit]ConsoleWrite("BinaryMid: "&TimerDiff($hTestTimer) & @LF)
ConsoleWrite("Bytes Read: "&$iBytesRead & @LF)
MsgBox(0,"","Exit")
[/autoit] [autoit][/autoit] [autoit][/autoit]Danke und Gruß,
Spider