Schneller Len(String$) Befehl
-
- Beiträge: 476
- Registriert: 23.03.2005 23:19
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
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
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
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.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
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)
mfg
Friedhelm
Friedhelm
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!
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!

PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
-
- Beiträge: 476
- Registriert: 23.03.2005 23:19
@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.
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.
Optimismus ist ein Mangel an Information.
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
@Friedhelm:
Bringt nichts, Memorylänge <> Stringlänge:
Die Idee ist auch schon alt^^
Bringt nichts, Memorylänge <> Stringlänge:
Code: Alles auswählen
S.s = "halloooossf0"
PokeC(@S+4, 0)
Debug MemorySize(@S) - 5 * SizeOf(character)
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...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.
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
hmm.. hier mal meine ergebnisse:
komisch, dass jetzt hells len langsamer ist als das erste mal wo ichs getestet hab.
c ya,
nco2k
hab noch den strlen() befehl von msschulte reingepackt.Hellhound66 : 484ms
WinAPI : 625ms
PB : 469ms
Friedhelm : 172ms
mssschulte : 156ms
komisch, dass jetzt hells len langsamer ist als das erste mal wo ichs getestet hab.
c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
-
- Beiträge: 476
- Registriert: 23.03.2005 23:19