CopyArray() - Array schnell kopieren

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.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

CopyArray() - Array schnell kopieren

Beitrag von cxAlex »

Hier ein kleines Snippet um schnell ein Array in ein Anderes zu kopieren egal welchen Typs (PB - Standard, Struktur...) und egal mit wie vielen Dimensionen. Finde ich persönlich ganz praktisch, vlt. kanns jemand brauchen.

Code: Alles auswählen

; Kopiert schnell ein Array in ein Anderes
Macro CopyArray(Array1, Array2, Type)
  CopyMemory(@Array1, @Array2, PeekI(@Array1-SizeOf(Quad))*SizeOf(Type))
EndMacro

; Test 1

Dim Array1(99)
Dim Array2(99)

; Array 1 füllen
For i = 0 To 99
  Array1(i) = i*2
Next

; Kopiern
CopyArray(Array1(), Array2(), Integer)

; Array 2 Ausgeben
For i = o To 99
  Debug Array2(i)
Next


; Test 2

Dim Array3(9,9)
Dim Array4(9,9)

; Array3 füllen
For i = 0 To 9
  For ii = 0 To 9
    x+1
    Array3(i, ii) = x
  Next
Next

; Kopiern
CopyArray(Array3(), Array4(), Integer)

; Array4 ausgeben
For i = 0 To 9
  For ii = 0 To 9
    Debug Array4(i, ii)
  Next
Next
Viel Spaß damit, Gruß, Alex :D
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
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

Beitrag von ts-soft »

Das Ergebnis Deines Beispiels erreiche ich aber mit Swap in einer vielfachen Geschwindigkeit :mrgreen:
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
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

ts-soft hat geschrieben:Das Ergebnis Deines Beispiels erreiche ich aber mit Swap in einer vielfachen Geschwindigkeit :mrgreen:
Mit dem Unterschied das Swap den Inhalt tauscht :mrgreen:
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

jo die sache hatten wie ja des öffteren.

Und da nur die Pointer von Strings kopiert werden, und nicht die Strings selber, würde sich eine änderung des String auf das Original und die Kopie beziehen, was nicht sein sollte, wenn es wirklich eine KOPIE ist!

Wäre also gut noch mal bei den andere Tips zu gucken, um auch Strings zu kopieren, nicht das Leute sich später wundern...
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
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Stimmt, also das geht mit allen Datentypen außer mit Strings gut. (Außer man verwendet fixed Strings)

@ts: ich denke denn Speedunterschied kann man vernachlässigen, ich bekomm bei 10 Mio. Durchläufen erst ne andere Dauer als 0 bei beiden Varianten:

Code: Alles auswählen

; Kopiert schnell ein Array in ein Anderes
Macro CopyArray(Array1, Array2, Type)
  CopyMemory(Array1, Array2, PeekI(Array1-SizeOf(Quad))*SizeOf(Type))
EndMacro

; Test 1

Dim Array1(100000)
Dim Array2(100000)

t = ElapsedMilliseconds()
For i = 1 To 10000000
  Swap Array1(), Array2()
Next
t1= ElapsedMilliseconds()-t

t = ElapsedMilliseconds()
For i = 1 To 10000000
  CopyMemory(Array1(), Array2(), Integer)
Next
t2= ElapsedMilliseconds()-t

MessageRequester("",Str(t1)+Chr(13)+Str(t2))
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

könnte ich durchaus mal brauchen...
Win11 x64 | PB 6.20
Antworten