Schneller Len(String$) Befehl

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

Beitrag 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.
Optimismus ist ein Mangel an Information.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

haut Euch woanders und bleibt beim Thema
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Friedhelm
Beiträge: 43
Registriert: 29.08.2004 08:50

Beitrag 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) 

mfg
Friedhelm
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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! :allright:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

Beitrag 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.
Optimismus ist ein Mangel an Information.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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^^
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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...
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
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

Beitrag 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.
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag 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
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

Beitrag von Hellhound66 »

Ihr müsst das letzte Ding von mir oder Helle nehmen. Das ist die schnellste Version.
Optimismus ist ein Mangel an Information.
Antworten