Geschwindigkeit

Anfängerfragen zum Programmieren mit PureBasic.
lite
Beiträge: 122
Registriert: 27.08.2012 21:08

Re: Geschwindigkeit

Beitrag von lite »

Danke Matbal für deine Funktion.

Jetzt hab ich noch eine Bitte.

Ich würde gerne eine Stringkette in den Speicher schreiben, aber nicht als Strings,
sondern als Hexwerte. Meine Funktion klappt, nur ist sie sehr langsam. z.B bei über 100 000 Zeichen. da dauert es einige Sekunden.
Hier für Unicode:

Code: Alles auswählen

String$="78DAA5975758135A97862345A922BD0A28BD86167A11104"
datalen=Len(String$)

*memdata = AllocateMemory(datalen)
y=0
For x=0 To datalen Step 2
  value=Val("$"+Mid(String$,(x+1),2))
  PokeB(*memdata+y,value)
  y+1
Next
weiss jemand wie man sowas viel schneller lösen kann ?

Grüße
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 »

So sollte es schnell genug sein:

Code: Alles auswählen

; Hex-String, der umgerechnet in einen Speicherbereich übertragen
; werden soll.
String$ = "78DAA5975758135A97862345A922BD0A28BD86167A11104"
; Berechne die Länge des Strings.
datalen = Len(String$)

; Alloziere halb so viel Speicher wie der String lange ist,
; da zwei Hexzeichen ein Byte ausmachen
*memdata = AllocateMemory(datalen / 2)

; Definiere einen Pointer um über den String zu iterieren
; und einen für *memdata
Define v.i, *c.Character, *m.Ascii

; Setze die Pointer auf den Anfang des Strings und von *memdata 
*c.Character = @String$
*m.Ascii = *memdata

; Iteriere so lange zeichenweise über den String bis das terminierende
; Nullbyte erreicht ist
While *c\c
	; a) Nimm den ASCII-Wert des Hexzeichens an der aktuellen Position
	;    im String mittels *c\c und subtrahiere den ASCII-Wert des Zeichens
	;    0 um die Ziffern 0 bis 9 auf ihre entsprechenden Zahlwerte zu
	;    mappen.
	*m\a = *c\c - '0'
	; b) War das Zeichen im String keine Zahl, sondern ein Buchstabe,
	;    zieh entsprechend des ASCII-Wert von A ab und addiere 10,
	;    damit die Buchstaben A-F auf die Werte 10 bis 15 gemappt werden.
	If *c\c >= 'A'
		*m\a = *c\c - 'A' + 10
	EndIf
	; c) Gehe im String um ein Zeichen weiter, in dem der Pointer
	;    um die Länge eines Zeichens inkrementiert wird.
	*c + SizeOf(Character)
	; Wurde das Ende des Strings schon erreich? Falls ja, beende die Schleife.
	If *c\c = 0 : Break : EndIf
	; Multipliziere den eben berechneten Wert mit 16 (Linksshift um 4
	; ist das selbe). Damit ist das höherwertige Hexzeichen fertig
	; berechnet.
	*m\a << 4
	; Berechne jetzt das zweite Hexzeichen, das ein Byte ausmacht.
	; siehe a)
	v = *c\c - '0'
	; siehe b)
	If *c\c >= 'A'
		v = *c\c - 'A' + 10
	EndIf
	; siehe c)
	*c + SizeOf(Character)
	; Addiere das niederwertige Hexzeichen zu dem höherwertigen. Damit
	; sind nun zwei Hexzeichen zu einem Byte umgerechnet worden.
	*m\a + v
	; Gehe im Zielspeicherbereich *memdata um ein Byte weiter.
	*m + SizeOf(Ascii)
Wend

; Gib den Speicherbereich als String aus.
Debug PeekS(*memdata) 
///Edit:
Code auf Wunsch von 7x7 nachträglich kommentiert.
lite
Beiträge: 122
Registriert: 27.08.2012 21:08

Re: Geschwindigkeit

Beitrag von lite »

@Nic
Vielen Dank, das ist sehr beeindruckend.
Obwohl dein Code viel länger ist, ist er schneller.
Was bremst in meinen Code ?

Grüße
Lite
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Geschwindigkeit

Beitrag von STARGÅTE »

In deinem Code benutzt du Umwandlungsfunktionen von String nach Zahl, sowas und arbeiten mit Strings ist immer langsammer, als direkt im Speicher zu arbeiten wie es NicTheQuick macht.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Geschwindigkeit

Beitrag von NicknameFJ »

Hallo Lite,

Ich gehe mal davon aus, dass Du noch Anfänger in Sachen Programmierung bist. Du wirst es noch lernen aber
lite hat geschrieben: Obwohl dein Code viel länger ist, ist er schneller.
Grüße
Lite
das eine hat mit dem anderen nichts, rein gar nichts zu tun.

NicknameFJ
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
lite
Beiträge: 122
Registriert: 27.08.2012 21:08

Re: Geschwindigkeit

Beitrag von lite »

Hallo
Denke, als Anfänger würd ich mich nicht bezeichnen.
Hab vor 27 Jahren in Assembler auf C64 und später auf Amiga programmiert.
Dazwischen waren einige Jahre Pause. Seit 2006 wieder mit au3 eingestiegen.
Seit September 2012 bin ich PB Neuling.
Versuche mich momentan darin, die ganze Breite der Sprache kennenzulernen.

Grüße
Lite
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Geschwindigkeit

Beitrag von 7x7 »

Mein lieber NicTheQuick, dein Versuch zu helfen in allen Ehren...aber dieses kryptische Code-Gewurschtle ohne erklärende Kommentare, ist - wie man an der Reaktion auch erkennen kann - für den Fragesteller im Erkenntnis-Bezug völlig nutzlos.

(siehe meine Signatur)
- 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 »

7x7 hat geschrieben:Mein lieber NicTheQuick, dein Versuch zu helfen in allen Ehren...aber dieses kryptische Code-Gewurschtle ohne erklärende Kommentare, ist - wie man an der Reaktion auch erkennen kann - für den Fragesteller im Erkenntnis-Bezug völlig nutzlos.

(siehe meine Signatur)
Ja, Kommentare sind immer schöner, bedeutet aber nicht gleich, dass etwas Müll ist. Das ist höchstens deine Meinung. Bei komplexen Sachen kommentiere ich gerne meinen Code, aber sowas hier ist ja noch leicht zu überblicken, wenn man weiß, was Pointer in PB sind. Andernfalls steht es jedem frei Fragen dazu zu stellen.
Aber wenn du es nicht verstehst, kann ich meinen Code gerne noch für dich kommentieren. Also?
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Geschwindigkeit

Beitrag von 7x7 »

NicTheQuick hat geschrieben:...kann ich meinen Code gerne noch für dich kommentieren. Also?
Gerne! :D
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Geschwindigkeit

Beitrag von ts-soft »

Der entsprechende "Basic" Code steht doch direkt darüber!
Wer das dann nicht versteht, hat die Sache mit den Pointern
noch nicht verstanden und dies zu Eklären ist in einem Forum-
thread wohl kaum möglich, dafür bedarf es eines Tutorials.

7x7 wunsch ist also eigentlich eher nicht umsetzbar, abgesehen
von ein paar belanglosen Kommentaren, die dann aber nichts
bringen.

Yust my two cents
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten