Seite 3 von 3
Verfasst: 10.10.2006 12:51
von Hellhound66
@kaeru:
1. Ich kann lesen.
2. Das war keine Antwort auf deinen Post.
3. suchen wir kein Testverfahren, sondern immer noch ne schnellere Möglichkeit.
Verfasst: 10.10.2006 12:55
von bobobo
haut Euch woanders und bleibt beim Thema
Verfasst: 10.10.2006 18:09
von Friedhelm
Ich habe ein wenig um die Ecke gedacht.
die Speicherverwaltung des Betriebssystem müsste doch wissen wie viel Speicher für den string reserviert ist!.
Und Glücklicherweise Weise gibt es bei den Memory den Befehlen
MemorySize()
Syntax
Ergebnis = MemorySize(*MemoryID)
Beschreibung
gibt die Länge (in Bytes) des angegebenen Speicherbereichs '*MemoryID' zurück.
Dieser Speicherbereich muss zuvor entweder mit AllocateMemory()
Unterstützte OS
Alle
Der die Länge des reserviert Speichers zurückliegt wenn er ein gültigen Pointer bekommen. den bekommen wir bekanntlich ja Weise mit dem Klammeraffen.
MemorySiz(@Sting) gibt die Länge von +5 (+10 Unicode)zurück.
Also Nr. 5 (10 Unicode )abziehen (*0.5) Und wir haben die längere.
Bitte testen
Code: Alles auswählen
;#PB 4.0
Prototype HellLen(UserString.s)
Global HellLen.HellLen
Goto __JUMPOVER
__HellLen:
!PUSH Edi
!PUSH Ecx
!MOV Edi,[Esp+12]
!XOR Ecx,Ecx
!XOR Ebx,Ebx
!__OUTERLOOP:
!MOV Eax,dword[Edi]
!TEST Eax,255
!JZ __FINISHED
!INC Ecx
!TEST Eax,65280
!JZ __FINISHED
!INC Ecx
!SHR Eax,16
!TEST Eax,255
!JZ __FINISHED
!INC Ecx
!TEST Eax,65280
!JZ __FINISHED
!INC Ecx
!ADD Edi,4
!JMP __OUTERLOOP
!__FINISHED:
!MOV Eax,Ecx
!POP Ecx
!POP Edi
!RET 4
__JUMPOVER:
HellLen = ?__HellLen
Delay(100)
string.s = "Ich bin ein fieser Teststring"
TestZeit.l = ElapsedMilliseconds()
For i=1 To 10000000
HellLen(string)
Next
Zeit1 = ElapsedMilliseconds()-TestZeit
TestZeit.l = ElapsedMilliseconds()
For i=1 To 10000000
lstrlen_(string)
Next
Zeit2 = ElapsedMilliseconds()-TestZeit
TestZeit.l = ElapsedMilliseconds()
For i=1 To 10000000
Len(string)
Next
Zeit3 = ElapsedMilliseconds()-TestZeit
TestZeit.l = ElapsedMilliseconds()
For i=1 To 10000000
Laege = MemorySize(@string)-5
;Laege = (MemorySize(@string)-10)*0.5 ;Unicode
Next
Zeit4 = ElapsedMilliseconds()-TestZeit
Debug Laege
Debug Len(string)
MessageRequester("Ergebnis","Es wurden je 10000000 Aufrufe gestartet"+#crlf$+"Hellhound66 : "+Str(Zeit1)+" ms."+#crlf$+"WinAPI brauchte : "+Str(Zeit2)+" ms."+#crlf$+"PB brauchte : "+Str(Zeit3)+" ms."+#crlf$+"Friedhelm's : "+Str(Zeit4)+" ms."+#crlf$,#PB_MessageRequester_Ok)
Verfasst: 10.10.2006 18:15
von AND51
Habs mal laufen lassen, um der Community einen gefallen zu tun:
Hellhound66: 5838 ms, Platz 4
Win-API: 5568 ms, Platz 3
PB brauchte: 5438 ms, Platz 2
Friedhelm's: 4216 ms, Platz 1 <--- Sieger
System: 550 MHz
Der Debugger zeigt eine Übereinstimmung: Beide Male 29.
Fazit: Auch, wenn ich keine Ahnung von ASM habe, ich scheue ASM nicht. Die Tatsache, dass PB auf dem 2. Platz gelandet ist, veranlasst mich persönlich dazu, lieber den bequemeren Weg mit dem schon eingebauten Befehl
Len() zu gehen, statt jedesmal noch eine extra Procedure einzubauen. Trotzdem ist das hier ein schöner Contest!

Verfasst: 10.10.2006 18:42
von Hellhound66
@and51:
Was hast du denn für einen komischen Computer?
Bei mir ist meine (alte) Routine schon doppelt so schnell, wie die PB Routine. Allerdings knapp langsamer als die MemorySize-Methode.
@Friedhelm: Das ist ja mal ne abgefuckt coole Idee. Nur kann man sich halt überhaupt nicht sicher sein, dass sie immer das richtige Ergebnis übergibt. Ein String von einem C-Modul, dass ich als interface eingebunden habe wird bestimmt falsche Ergebnisse liefern. Aber für "normale" PB Strings ist das ne fette Idee.
Verfasst: 10.10.2006 18:47
von remi_meier
@Friedhelm:
Bringt nichts, Memorylänge <> Stringlänge:
Code: Alles auswählen
S.s = "halloooossf0"
PokeC(@S+4, 0)
Debug MemorySize(@S) - 5 * SizeOf(character)
Die Idee ist auch schon alt^^
Verfasst: 10.10.2006 20:01
von AND51
Hellhound66 hat geschrieben:@and51:
Was hast du denn für einen komischen Computer?
Bei mir ist meine (alte) Routine schon doppelt so schnell, wie die PB Routine. Allerdings knapp langsamer als die MemorySize-Methode.
Das sind die Ergebnisse von meinem Intel P3 Computer. An den Ergebnissen habe ich nichts verfälscht oder so, das ist, was bei mir rauskam. Kann ich auch nichts dafür...
Verfasst: 10.10.2006 20:16
von NicTheQuick
Bei mir sieht's auch etwas anders aus:
Es wurden je 10000000 Aufrufe gestartet
Hellhound66 : 661 ms.
WinAPI brauchte : 1002 ms.
PB brauchte : 981 ms.
Friedhelm's : 411 ms.
Verfasst: 10.10.2006 20:32
von nco2k
hmm.. hier mal meine ergebnisse:
Hellhound66 : 484ms
WinAPI : 625ms
PB : 469ms
Friedhelm : 172ms
mssschulte : 156ms
hab noch den
strlen() befehl von msschulte reingepackt.
komisch, dass jetzt hells len langsamer ist als das erste mal wo ichs getestet hab.
c ya,
nco2k
Verfasst: 10.10.2006 20:35
von Hellhound66
Ihr müsst das letzte Ding von mir oder Helle nehmen. Das ist die schnellste Version.