AddElement() schneller als AllocateMemory()

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

AddElement() schneller als AllocateMemory()

Beitrag von STARGÅTE »

Tachchen,

mich wunder gerade folgendes:
Hinweis: Es werden ca 700MB RAM benötigt !

Code: Alles auswählen

Structure Byte20
  b.b[20]
EndStructure
NewList Test.Byte20()

#Size = 10000000

Time = ElapsedMilliseconds()
For n = 1 To #Size
 AddElement(Test())
Next
Time1 = ElapsedMilliseconds()-Time

Time = ElapsedMilliseconds()
For n = 1 To #Size
 AllocateMemory(20)
Next
Time2 = ElapsedMilliseconds()-Time

MessageRequester("Testergebnis", "Time1: "+Str(Time1)+Chr(10)+"Time2: "+Str(Time2))
Wieso ist ein AddElement() vier mal schneller als AllocateMemory(), obwohl beide 20Bytes "anlegen" und das AddElement() auch noch n Header mitschleifen muss ?

Nach dem Ergebnis würde ich nun nicht mehr AllocateMemory() nutzen um "viele" Speicher zu erstellen, sonden dafür n Liste machen mit der gleichen Element-Länge ... und dann immer AddElement()

---------------------------
Testergebnis
---------------------------
Time1: 532
Time2: 2078
---------------------------
OK
---------------------------
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
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: AddElement() schneller als AllocateMemory()

Beitrag von Josh »

kann es sein, dass AddElement noch gar keinen speicher reserviert und dieser erst beim schreiben zugewiesen wird?
Benutzeravatar
hörmi
Beiträge: 106
Registriert: 10.07.2007 15:20
Kontaktdaten:

Re: AddElement() schneller als AllocateMemory()

Beitrag von hörmi »

Bestätige:
Time1:2547
Time2:4656

Edit:
@Josh: der speicher müsste sofort reserviert werden
wenn ich eins der befehle rausstreiche (AddElement oder AllocateMemory) reservieren beide programme am ende annähern gleich viel. ca 318MB
BildBild Bild
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: AddElement() schneller als AllocateMemory()

Beitrag von Josh »

dreh mal die beiden beispiele um, dass AllocateMemory zuerst ausgeführt wird

:bounce:
Benutzeravatar
hörmi
Beiträge: 106
Registriert: 10.07.2007 15:20
Kontaktdaten:

Re: AddElement() schneller als AllocateMemory()

Beitrag von hörmi »

Das hab ich mir vorher auch schon mal gedacht aber auch beim umdrehen war bei mir AddElement schneller???
BildBild Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: AddElement() schneller als AllocateMemory()

Beitrag von STARGÅTE »

ja und ?

Code: Alles auswählen

Structure Byte20
  b.b[20]
EndStructure
NewList Test.Byte20()

#Size = 10000000

Time = ElapsedMilliseconds()
For n = 1 To #Size
AllocateMemory(20)
Next
Time1 = ElapsedMilliseconds()-Time

Time = ElapsedMilliseconds()
For n = 1 To #Size
AddElement(Test())
Next
Time2 = ElapsedMilliseconds()-Time

MessageRequester("Testergebnis", "Time1: "+Str(Time1)+Chr(10)+"Time2: "+Str(Time2)) 
dann ist AddElement immer ncoh 4mal schneller:
---------------------------
Testergebnis
---------------------------
Time1: 2047
Time2: 547
---------------------------
OK
---------------------------
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
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: AddElement() schneller als AllocateMemory()

Beitrag von Josh »

habs grad gemerkt, dass ich Time1 und Time2 dann zumindest gedanklich auch umdrehen hätte müssen ^^
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: AddElement() schneller als AllocateMemory()

Beitrag von STARGÅTE »

also wenn man gleich danach wieder freigibt, wäre Memory wiederum schneller:

Code: Alles auswählen

NewList Test.s{10}()

#Size = 10000000

Time = ElapsedMilliseconds()
For n = 1 To #Size
  AddElement(Test())
  test() = "1234567890"
  DeleteElement(Test())
Next
Time1 = ElapsedMilliseconds()-Time

Time = ElapsedMilliseconds()
For n = 1 To #Size
  *E = AllocateMemory(20)
  PokeS(*E, "1234567890")
  FreeMemory(*E)
Next
Time2 = ElapsedMilliseconds()-Time

MessageRequester("Testergebnis", "Time1: "+Str(Time1)+Chr(10)+"Time2: "+Str(Time2)) 
---------------------------
Testergebnis
---------------------------
Time1: 2203
Time2: 1734
---------------------------
OK
---------------------------
ABER!

Das liegt daran das man die Liste dabei immer leer macht, und der Header viel umschrieben werden muss. Macht man am anfang n Totes Element mit rein:

Code: Alles auswählen

NewList Test.s{10}()

#Size = 10000000

AddElement(Test())

Time = ElapsedMilliseconds()
For n = 1 To #Size
  AddElement(Test())
  test() = "1234567890"
  DeleteElement(Test())
Next
Time1 = ElapsedMilliseconds()-Time

Time = ElapsedMilliseconds()
For n = 1 To #Size
  *E = AllocateMemory(20)
  PokeS(*E, "1234567890")
  FreeMemory(*E)
Next
Time2 = ElapsedMilliseconds()-Time

MessageRequester("Testergebnis", "Time1: "+Str(Time1)+Chr(10)+"Time2: "+Str(Time2)) 
---------------------------
Testergebnis
---------------------------
Time1: 750
Time2: 1766
---------------------------
OK
---------------------------
Kann man nun klar feststellen, dass das nutzen von Speichern (erstellen, löschen) doppelt so lange brauchst wie das nutzen von Elementen einer LinkedList !
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
hörmi
Beiträge: 106
Registriert: 10.07.2007 15:20
Kontaktdaten:

Re: AddElement() schneller als AllocateMemory()

Beitrag von hörmi »

STARGÅTE hat geschrieben: Kann man nun klar feststellen, dass das nutzen von Speichern (erstellen, löschen) doppelt so lange brauchst wie das nutzen von Elementen einer LinkedList !
nur von kleinen speichern

Code: Alles auswählen

#mem_size=20000
NewList Test.s{#mem_size}()

#Size = 1000000

AddElement(Test())

Time = ElapsedMilliseconds()
For n = 1 To #Size
  AddElement(Test())
  test() = "1234567890"
  DeleteElement(Test())
Next
Time1 = ElapsedMilliseconds()-Time

Time = ElapsedMilliseconds()
For n = 1 To #Size
  *E = AllocateMemory(#mem_size)
  PokeS(*E, "1234567890")
  FreeMemory(*E)
Next
Time2 = ElapsedMilliseconds()-Time

MessageRequester("Testergebnis", "Time1: "+Str(Time1)+Chr(10)+"Time2: "+Str(Time2))
BildBild Bild
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Re: AddElement() schneller als AllocateMemory()

Beitrag von Franky »

*Aufzeig* Ich weiß es, Herr Stargate, ich weiß es :bounce:
Du hast es ja annehmbarer weise mit PureBasic 4.4 oder 4.3 getestet, genau wie alle anderen auch.
Laut diesem Artikel im PureBasic Blog hat Freak den Aufbau von Listen geändert. Es werden nun größere zusammenhängende Bereiche reserviert, das heißt, dass von deinen ka, sagen wir 10 "AddElement" nur eines eine Speicherreservierung auslöst.
Dadurch ist es dann schneller

Bild
Ich bin so K-L-U-K,Ich bin so K-L-U-K
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Antworten