Geschwindigkeit

Anfängerfragen zum Programmieren mit PureBasic.
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

Re: Geschwindigkeit

Beitrag von NicTheQuick »

7x7 hat geschrieben:
NicTheQuick hat geschrieben:...kann ich meinen Code gerne noch für dich kommentieren. Also?
Gerne! :D
Viel Spaß damit.
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Geschwindigkeit

Beitrag von 7x7 »

Ist zwar etwas overkill, aber jetzt habe ich endlich alles kapiert :D
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
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

Re: Geschwindigkeit

Beitrag von NicTheQuick »

Mir fällt's da auch eh immer schwer den richtigen Punkt zwischen grober und detaillierter Erklärung zu finden.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Geschwindigkeit

Beitrag von bobobo »

Blindfischfütterung :mrgreen:

Wer Code nicht lesen kann oder will, will Code nicht lesen oder kann es nicht.

außerdem fehlt ein '-1,#PB_Ascii)' in Nics Code
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
lite
Beiträge: 122
Registriert: 27.08.2012 21:08

Re: Geschwindigkeit

Beitrag von lite »

Hallo

Hab den Code für ungerade Stringfolgen optimiert.

Code: Alles auswählen

String$ = "78DAA5975758135A97862345A922BD0A28BD86167A111040"
String$ = "78d"

datalen = Len(String$)
If datalen =0: End: EndIf
datalen=Round(datalen / 2,#PB_Round_Nearest)

*memdata = AllocateMemory(datalen)

Define v.i, *c.Character, *m.Ascii
*c.Character = @String$
*m.Ascii = *memdata
While *c\c
  *m\a = *c\c - '0'    ; unteres Nibbel   ; Zahl umrechnen
  If *c\c >= 'A': *m\a = *c\c - 'A' + 10: EndIf ; Buchstabe umrechnen
     
  *c + SizeOf(Character)
  If *c\c = 0
    *m\a &15  ; bei ungerade , Reste von oberes Nibbel löschen
    Break     ; schleife beenden
  EndIf
   *m\a << 4  ; unteres Nibbel nach oben verschieben
   v = *c\c - '0'   ; Zahl umrechnen
   If *c\c >= 'A': v = *c\c - 'A' + 10:  EndIf  ; Buchstabe umrechnen
   *m\a + v   ; oberes und unteres Nibbel addieren
   *c + SizeOf(Character) ; quell Pointer erhöhen
   *m + SizeOf(Ascii)     ; Ziel Pointer erhöhen
Wend
ShowMemoryViewer(*memdata,datalen)
Grüße
Lite
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Geschwindigkeit

Beitrag von _JON_ »

Lite, dein Code hat aber ein Problem:

Es gibt von demn String "78d" die Bytes 78 0D zurück.
Richtig wäre eigentlich 07 8D.

Wenn eine ungerade Springlänge hast füge doch einfach vorne ein "0" an, bevor du es konvertierst.
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
lite
Beiträge: 122
Registriert: 27.08.2012 21:08

Re: Geschwindigkeit

Beitrag von lite »

@_jon_
Bin nicht ganz deiner Meinung.
Die Schreibweise erfolgt paarweise von Links.
z.B. 78d = 78 d
Im Speicher sollte dann stehen "78 0d".

Lite
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

Re: Geschwindigkeit

Beitrag von NicTheQuick »

Das eigentliche Problem ist, dass mein Code nur funktioniert, wenn die Buchstaben im Hex-String groß geschrieben werden. Bei Kleinbuchstaben wie dem d wird falsch umgerechnet, da d den ASCII-Wert 100 hat, dann der ASCII-Code von A abgezogen wird, das wäre dann 100 - 65 = 35 und dann 10 addiert wird, womit wir 45 erhalten statt dem eigentlichen Wert 13. ;)

Und wegen dem anderen Problem, fände ich es schlauer aus einem ungeraden String mit dem Inhalt 78D dann 78 D0 zu machen, oder?
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Geschwindigkeit

Beitrag von _JON_ »

lite hat geschrieben:@_jon_
Bin nicht ganz deiner Meinung.
Die Schreibweise erfolgt paarweise von Links.
z.B. 78d = 78 d
Im Speicher sollte dann stehen "78 0d".
Nun gut sind deine Daten/Werte und du wirst schon wissen wie du sie interpretierst.
Aber das "78 0d" finde ich dann wiederum auch komisch,
wäre dann nicht (wie NicTheQuick meint) "78 D0" das richtige Ergebnis?

Wie auch immer persönlich würde ich im Fall eines ungeraden Strings hier einen Datenfehler melden und das nicht einfach ignorieren.
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
lite
Beiträge: 122
Registriert: 27.08.2012 21:08

Re: Geschwindigkeit

Beitrag von lite »

Hallo

Hätte wieder ein kleines Problem mit der Geschwindigkeit.
Meine Aufgabenstellung ist, ich möchte Strings zu einem String zusammen zu fügen.

Beispiel in PB:

Code: Alles auswählen

#Size = 50000
a$=""
Time = ElapsedMilliseconds()
For n = 1 To #Size
    a$+"w"
Next
Time1 = ElapsedMilliseconds()-Time
MessageRequester(Str(time1),a$)
Dieses Beispiel in PureBasic benötigt 13000 ms.

Das Beispiel in Au3:

Code: Alles auswählen

$begin = TimerInit()
$a=""
$size= 50000
for $n=1 to $size
$a=$a&"w"
next
$dif = TimerDiff($begin)
MsgBox(0,"Time Difference",$dif&@crlf&$a)
In Au3 benötigt dieses Beispiel 845 ms.

Gibt es eine Lösung diese Stringverwaltung schneller zu machen ?
Dim a$(50000) nützt mir nichts, die Strings die hinzugefügt werden sind in der Größe variabel.

Lite
Antworten