Seite 1 von 2
AddElement() schneller als AllocateMemory()
Verfasst: 16.03.2010 17:59
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
---------------------------
Re: AddElement() schneller als AllocateMemory()
Verfasst: 16.03.2010 18:21
von Josh
kann es sein, dass AddElement noch gar keinen speicher reserviert und dieser erst beim schreiben zugewiesen wird?
Re: AddElement() schneller als AllocateMemory()
Verfasst: 16.03.2010 18:23
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
Re: AddElement() schneller als AllocateMemory()
Verfasst: 16.03.2010 19:03
von Josh
dreh mal die beiden beispiele um, dass AllocateMemory zuerst ausgeführt wird

Re: AddElement() schneller als AllocateMemory()
Verfasst: 16.03.2010 19:05
von hörmi
Das hab ich mir vorher auch schon mal gedacht aber auch beim umdrehen war bei mir AddElement schneller???
Re: AddElement() schneller als AllocateMemory()
Verfasst: 16.03.2010 19:05
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
---------------------------
Re: AddElement() schneller als AllocateMemory()
Verfasst: 16.03.2010 19:06
von Josh
habs grad gemerkt, dass ich Time1 und Time2 dann zumindest gedanklich auch umdrehen hätte müssen ^^
Re: AddElement() schneller als AllocateMemory()
Verfasst: 16.03.2010 19:10
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 !
Re: AddElement() schneller als AllocateMemory()
Verfasst: 16.03.2010 19:19
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))
Re: AddElement() schneller als AllocateMemory()
Verfasst: 16.03.2010 20:25
von Franky
*Aufzeig* Ich weiß es, Herr Stargate, ich weiß es
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
Ich bin so K-L-U-K,Ich bin so K-L-U-K