STRTRAN() extrem langsam

09/09/2007 - 01:57 von Karsten Helper | Report spam
Hallo Freunde,

ich teste gerade eine neue Funktion und musste leider feststellen, dass
STRTRAN() bei der Verarbeitung eines größeren Strings echte Probleme
hat und die Verarbeitungszeit mehr als zu wünschen übrig làsst...

Hier mal ein kurzes Beispiel:

lcData=REPLICATE(CHR(0), 1024000)
lnTimer1=SECONDS()
lcData=STRTRAN(lcData, CHR(0), "\0")
lnTimer1=SECONDS()-lnTimer1
? "Verarbeitungszeit mit einem 1 MB großem String: "+TRANS(lnTimer1)+"
Sekunden (= " + TRANS(lnTimer1/1) + " Sekunden/MB)"

lcData=REPLICATE(CHR(0), 10240000/2)
lnTimer2=SECONDS()
lcData=STRTRAN(lcData, CHR(0), "\0")
lnTimer2=SECONDS()-lnTimer2
? "Verarbeitungszeit mit einem 10 MB großem String: "+TRANS(lnTimer2)+"
Sekunden (= " + TRANS(lnTimer2/10) + " Sekunden/MB)"

lcData=REPLICATE(CHR(0), 20480000/2)
lnTimer3=SECONDS()
lcData=STRTRAN(lcData, CHR(0), "\0")
lnTimer3=SECONDS()-lnTimer3
? "Verarbeitungszeit mit einem 20 MB großem String: "+TRANS(lnTimer3)+"
Sekunden (= " + TRANS(lnTimer3/20) + " Sekunden/MB)"

Selbst auf meinem Quad-Core mit 4GB Hauptspeicher lassen sich keine
akzeptablen Zeiten erzielen.
Weiß zufàllig jemand von Euch, woran das liegen kann und welche alternative
Funktion ich benutzen könnte?


Besten Dank für Eure Hilfe und Antworten!
 

Lesen sie die antworten

#1 Jürgen Wondzinski
09/09/2007 - 09:52 | Warnen spam
Hallo Karsten,

a) Ein QuadCore bringt garnix. Ein einzelner Funktionsaufruf wird immer(!)
von einer CPU bearbeitet, egal wieviele du verbaust. dazu kommt noch, dasss
VFP per se nicht Mehrprozessorfàhig ist (d.h. es kann nicht selbststàndig
einzelne Prozesse auf mehrere Prozessoren verteilen)

b) auch deine 4 Gb nützen nix. VFP arbeitet am schnellsten, wenn man im
mittels SYS(3050) den Cachespeicher auf 32-64 MB einstellt.

c) Deine Anforderung ist natürlich auch ein Extremfall. Klar, dsa ist ein
Testprogramm, aber denk dran: In deiner STRTRAN Verwendung wird der String
immer lànger, d.h. da ist ein Haufen Memorymanagement und Pointergeschubbse
notwendig.

Hast es schon mal mit ner Schleife probiert, die zB immer nur 0.1 MB Strings
nacheinander verarbeitet? zB so:

lcData1=Replicate(Chr(0), 10240000)
lcData2 = ""
lnSegment = 100000
lnTimer=Seconds()
For i = 1 To Len(lcData1) Step lnSegment
lcPart = Substr(lcData1, i, lnSegment)
lcPart=Strtran(lcPart, Chr(0), "\0")
lcData2 = lcData2 + lcPart
Endfor
lnTimer=Seconds()-lnTimer
? len(lcData1), lnTimer

Hat bei mir die Verarbeitungszeit für 10MB auf 5,3 sec gebracht (vorher
waren es 91 sec)

Übrigens misst dein Testprogramm mit 5 und 10 MB, nicht wie im Ausgabetext
dann angegebenen 10 und 20 MB. (Man beachte das "/2") bei deinem REPLICATE)


Jürgen Wondzinski

Microsoft Visual FoxPro Technologieberater
Geschàftsführung ProLib Software GmbH
Microsoft Most Valuable Professional seit 1996
"*´¨)
¸.•´¸.•*´¨) ¸.•*¨)
(¸.•´. (¸.•` *
.•`.Visual FoxPro: It's magic !
(¸.•``••*

Ähnliche fragen