VBScript Laufzeit Problem

27/08/2010 - 12:47 von Holger Lembke | Report spam
Hi,

in geerbtem Code macht jemand folgendes

set stream = file.OpenAsTextStream(ForReading, TristateFalse)
stream.skip(start)

while Not stream.AtEndOfStream and i < laenge
strD = strD & Right("0" & Hex(Asc(stream.Read(1))), 2)
i = i + 1
Wend
stream.close

Wenn ich das richtig sehe, dann baut er eine Zeichenkette aus den Daten
zusammen. (In der Datei steht binàr 01 02 03, hier kommt dann 010203 raus.)

Die Routine ist, ràupser, laufzeittechnisch ungünstig. Nachgemessen braucht
sie für 125.208 Byte ca. 45 Sekunden.

Ich nehme mal an, dass das byteweise Lesen, konvertieren und
Stringverlàngern nicht besonders günstig ist.

Da ich in vbscript eher ahnungslos bin: Wie macht man es besser?

Danke!

mit freundlichen Grüßen! Password Must Be at Least 18770 Characters
Holgi, +49-531-3497854 ! Can't Repeat Any of Your Previous 30689 Passwords
 

Lesen sie die antworten

#1 Schmidt
27/08/2010 - 15:47 | Warnen spam
"Holger Lembke" schrieb

in geerbtem Code macht jemand folgendes

set stream = file.OpenAsTextStream(ForReading, TristateFalse)
stream.skip(start)

while Not stream.AtEndOfStream and i < laenge
strD = strD & Right("0" & Hex(Asc(stream.Read(1))), 2)
i = i + 1
Wend
stream.close

Wenn ich das richtig sehe, dann baut er eine Zeichenkette aus
den Daten zusammen. (In der Datei steht binàr 01 02 03, hier
kommt dann 010203 raus.)



Das da oben ist eine Binàr-nach-Hex-Konvertierung -
das (Hex-) Ergebnis dann abgelegt in einem String.

Wenn angewandt auf ein komplettes File, dann kommt ein
String mit doppelter (File-)Lànge raus (2HexDigits pro Byte).

Die Routine ist, ràupser, laufzeittechnisch ungünstig. Nachgemessen
braucht sie für 125.208 Byte ca. 45 Sekunden.

Ich nehme mal an, dass das byteweise Lesen, konvertieren und
Stringverlàngern nicht besonders günstig ist.



Solche "Codecs" platziert man normalerweise in einer Dll -
und ruft dann die Convert-Methode der Dll von VBScript aus.

Dennoch làsst sich das Ganze auch in VBScript etwas flotter
hinbekommen (ca. Faktor 150-200 besser), wenn man
sowas wie den "StringBuilder-Ersatz" (die Join-Funktion)
einsetzt, die vor allem die sehr ineffiziente String-Verlàngerung
strD = strD & NàchstesHexChar
vermeiden hilft.

Hier mal als Sub-Routine (den HexString returnierend):

Function HexEncodeFileContent(FileName, StartOffset)
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")

Dim File, Stream
Set File = FSO.GetFile(FileName)
Set Stream = File.OpenAsTextStream(ForReading, TristateFalse)
Stream.Skip StartOffset

Dim strContent
strContent = Stream.ReadAll

Dim i, HexLookupArr, HexDstArr, T

ReDim HexLookupArr(0 To 255)
For i = 0 To 255
HexLookupArr(i) = Right("0" & Hex(i), 2)
Next i

ReDim HexDstArr(1 To Len(strContent))
For i = 1 To Len(strContent)
HexDstArr(i) = HexLookupArr(Asc(Mid(strContent, i, 1)))
Next i

HexEncodeFileContent = Join(HexDstArr, "")
End Function

Oh BTW, falls Du Interesse daran hast, Fragen zu Basic
künftig in einer neuen Basic-Newsgroup in de.* zu stellen,
es làuft gerade ein Abstimmungsverfahren zwecks Einrichtung.

Informationen dazu findest Du hier in dieser Gruppe,
in einem Posting von Thomas Hochstein (18.08.2010):
1. CfV: de.comp.lang.[basic.]vbclassic (Einrichtung)


Olaf

Ähnliche fragen