Hi,
vielen Dank für die Rückmeldungen. Ich habe das Beispiel ausprobiert und war so verblüfft, dass es sich so gar nicht mit meinen Erfahrungen deckt,
dass ich gleich noch ein wenig rumexperimentiert habe.
Bei mir kam dabei heraus, dass einzig und allein die Random-Funktion für den Geschwindigkeitsunterschied verantwortlich ist. Ersetzt man ihn durch einen festen Wert,
so sind beide Varianten gleich schnell. Warum die Random-Funktion unterschiedlich schnell ausfällt, ist mir bislang ein Rätsel...vielleicht liegt es an SelectElement.
Ich habe zwei Gegenbeispiele zur Veranschaulichung. Im ersten Beispiel zähle ich die Liste mit For-Next und NextElement() durch. Und obwohl bei jedem Durchgang
eine zusätzliche Funktion (NextElement) ausgeführt wird, ist die Liste fast gleich schnell mit dem Array.
Im zweiten Beispiel nutze ich die optimierte Variante "ForEach-Next" und hier sind dann beide Varianten gleich schnell.
Fast gleich schnell mit For-Next und NextElement():
Code: Alles auswählen
Define TimeArray.i, TimeList.i, n.i, Value.i
#Size = 1000000
Global Dim MyArray.i(#Size-1)
Global NewList MyList.i()
For n = 1 To #Size
AddElement(MyList())
Next
TimeArray = ElapsedMilliseconds()
For n = 0 To #Size -1
MyArray(n) = 12345
Value = MyArray(n)
Next
TimeArray = ElapsedMilliseconds()-TimeArray
TimeList = ElapsedMilliseconds()
ResetList(MyList())
For n = 1 To #Size
NextElement(MyList())
MyList() = 12345
Value = MyList()
Next
TimeList = ElapsedMilliseconds()-TimeList
MessageRequester("Result", "TimeArray: "+StrF(TimeArray)+" ms"+#LF$+"TimeList: "+StrF(TimeList)+" ms")
Gleich schnell mit Verwendung von ForEach-Next:
Code: Alles auswählen
Define TimeArray.i, TimeList.i, n.i, Value.i
#Size = 1000000
Global Dim MyArray.i(#Size-1)
Global NewList MyList.i()
For n = 1 To #Size
AddElement(MyList())
Next
TimeArray = ElapsedMilliseconds()
For n = 0 To #Size -1
MyArray(n) = 12345
Value = MyArray(n)
Next
TimeArray = ElapsedMilliseconds()-TimeArray
TimeList = ElapsedMilliseconds()
ForEach MyList()
MyList() = 12345
Value = MyList()
Next
TimeList = ElapsedMilliseconds()-TimeList
MessageRequester("Result", "TimeArray: "+StrF(TimeArray)+" ms"+#LF$+"TimeList: "+StrF(TimeList)+" ms")
Also reines Durchzählen, Werte reinschreiben oder auslesen macht in der Praxis wohl kaum einen Unterschied.
Oder habe ich hier etwas übersehen bzw. nicht bedacht?
Hier ein Auszug aus der PureBasic-Hilfe über Arrays:
PureBasic-Hilfe hat geschrieben:Arrays sind Strukturen zum Speichern von indizierten Elementen. Anders als bei einer verknüpften Liste oder bei einer Map werden die Elemente in einer zusammenhängenden Weise im Speicher angelegt. Somit ist es nicht so einfach möglich, ein Element einzufügen oder zu entfernen. Auf der anderen Seite bietet diese sehr schnellen und direkten Zugriff auf ein beliebiges Element.
Es wird hier zwar nicht direkt gesagt, dass Arrays
schneller als Listen sind...aber es wird gesagt, dass Arrays im Vergleich zu Listen einen schnellen Zugriff bieten.
Wenn hier kein Bezug auf Listen und Maps gemeint ist, ist der letzte Satz sehr gewagt formuliert
Viele Grüße,
Andi