Listen oder Objektpools?

Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

mpmxyz

BeitragMo, Nov 01, 2010 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier ist auch noch einmal eine ganz einfache Liste:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Type TListTest
Field _first:TLinkTest
Method AddFirst(obj:String)
Local oldfirst:TLinkTest=_first
_first=New TLinkTest
_first.data=obj
If oldfirst
_first._succ=oldfirst
EndIf
EndMethod

Method RemoveFirst:String()
If _first=Null Then Return ""
Local oldfirst:TLinkTest=_first
_first=_first._succ
Return oldfirst.data
EndMethod
EndType

Type TLinkTest
Field data:String
Field _succ:TLinkTest
EndType


Local list:TListTest=New TListTest
For Local i:Int=1 To 10
list.AddFirst(String(i))
Next
Local data:String=""
Repeat
data=list.RemoveFirst()
Print data
Until data=""

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Macintosh

BeitragMo, Nov 01, 2010 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
ups. habe mich geirrt. sorry ^^ :(

DaysShadow

BeitragMo, Nov 01, 2010 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Nochwas, warum bitte kann der String Operatoren überladen? Weil mann "Hallo" + " Welt" schreiben kann?
Das ist einfach nur im Compiler oder Parser oder whatever festgelegt, dass das geht, nehme ich an.

Oder gehts um was ganz anderes und ich stehe auf dem Schlauch? ^^
Blessed is the mind too small for doubt

Shinkiro1

ehemals "Espada"

BeitragDi, Nov 02, 2010 0:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie schon erwähnt, der Performance Unterschied ist meist zu gering.
Ich kann mich aber erinnern, dass eine List in einer ForEach Loop schneller war als ein Array. Aber häng dich nicht an solchen Kleinigkeiten auf.
Das, was man meist wirklich optimieren kann ist das Gameplay ;D

Jolinah

BeitragDi, Nov 02, 2010 12:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo, in der heutigen Zeit würde ich empfehlen als erstes das zu verwenden womit man es einfacher umsetzen kann, bzw. was halt Sinn macht in der jeweiligen Situation. Wie gesagt: Listen bei dynamischer Anzahl an Objekten, Array bei festgelegter Anzahl.

Wenn man merkt es ist viel zu langsam, dann kann man mit optimieren beginnen. In den meisten Fällen läuft es nämlich auch so schnell genug und man hätte nur unnötig Zeit vergeudet.

Die Sache mit dem IsInUse ist denke ich auch nicht schneller, eher langsamer. Denn dazu muss man ja immer durch das ganze Array gehen, ein Objekt finden dass noch nicht "in use" ist und dieses dann aktivieren und die Eigenschaften setzen etc...

Es sei denn dieser ObjektPool hätte eine Liste mit aktiven Objekten und eine Queue mit inaktiven. Dann könnte man von der Queue ein inaktives Objekt holen, die Eigenschaften setzen und es in die Liste der aktiven einfügen. Beim Löschen dann umgekehrt. (Aber das bringt schlussendlich auch nichts imho).

In der Zeit wo die meisten Systeme 2 - 8 GB RAM haben muss man auch nicht mehr soo extrem auf jedes einzelne Byte Speicherverbrauch achten, viel wichtiger ist das inzwischen bei der Netzwerkkommunikation.

Fazit: Die meisten zerbrechen sich über sowas im Voraus viel zu sehr den Kopf. Lieber mehr Zeit in die Programm/Spiel-Logik ansich investieren Very Happy

Lastmayday

BeitragDi, Nov 02, 2010 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Als um das thema mit dem speed von listen und arrays mal zu klären:

Benchmark:
AddLast 1000000 times
361ms
For eachin run
84ms
remove takes
2888ms
AddFirst
526ms
For eachin run
89ms
Clear takes
107ms
fillup a Array
311ms
run a Array
35ms
clear a Array
56ms
AddLast in list1
AddLast in list2
For eachin run in list1(100) and list2(1000000)
totaltimes: 100000000
11280ms
For eachin run in list2(1000000) and list1(100)
2483ms

(Tipp: warum der unterschied zwischen den letzenbeiden so groß ist? es hatt was mit dem L1 und L2 cache zu tun . . . ) Wink
Code:

BlitzMax: [AUSKLAPPEN]
SuperStrict

Type Ttest
Global SID:Int
Field ID:Int = 0
Field data:String = "1234567890"
End Type

Local list:TList = CreateList()
Local times:Int = 1000000

Print "AddLast " + times + " times"
Local time:Int = MilliSecs()
For Local x:Int = 0 To times - 1
Local n:Ttest = New Ttest
n.id = Ttest.SID ; Ttest.SID:+1
n.data:+n.id
list.AddLast(n)
Next
Print (MilliSecs() - time) + "ms"

Print "For eachin run"
time = MilliSecs()
For Local f:Ttest = EachIn list
f.id:+1
Next
Print (MilliSecs() - time) + "ms"

Print "remove takes"
time = MilliSecs()
For Local f:Ttest = EachIn list
list.Remove(f)
Next
Print (MilliSecs() - time) + "ms"

Print "AddFirst "
time = MilliSecs()
For Local x:Int = 0 To times - 1
Local n:Ttest = New Ttest
n.id = Ttest.SID ; Ttest.SID:+1
n.data:+n.id
list.AddFirst(n)
Next
Print (MilliSecs() - time) + "ms"

Print "For eachin run"
time = MilliSecs()
For Local f:Ttest = EachIn list
f.id:+1
Next
Print (MilliSecs() - time) + "ms"

Print "Clear takes"
time = MilliSecs()
list.Clear()
Print (MilliSecs() - time) + "ms"

Print "fillup a Array "
Local array:Ttest[times]
time = MilliSecs()
For Local x:Int = 0 To times - 1
Local n:Ttest = New Ttest
n.id = Ttest.SID ; Ttest.SID:+1
n.data:+n.id
array[x] = n
Next
Print (MilliSecs() - time) + "ms"

Print "run a Array "
time = MilliSecs()
For Local x:Int = 0 To times - 1
array[x].id:+1
Next
Print (MilliSecs() - time) + "ms"


Print "clear a Array "
time = MilliSecs()
For Local x:Int = 0 To times - 1
array[x] = Null
Next
Print (MilliSecs() - time) + "ms"


Local list2:TList = CreateList()

Print "AddLast in list1"
For Local x:Int = 0 To (times / 10000) - 1
Local n:Ttest = New Ttest
n.id = Ttest.SID ; Ttest.SID:+1
n.data:+n.id
list.AddLast(n)
Next

Print "AddLast in list2"
For Local x:Int = 0 To times - 1
Local n:Ttest = New Ttest
n.id = Ttest.SID ; Ttest.SID:+1
n.data:+n.id
list2.AddLast(n)
Next


Print "For eachin run in list1(" + (times / 10000) + ") and list2(" + times + ")"
Print "totaltimes: " + ((times / 10000) * times)
time = MilliSecs()
For Local f:Ttest = EachIn list
f.id:+1
For Local v:Ttest = EachIn list2
v.id:+1
Next
Next
Print (MilliSecs() - time) + "ms"

Print "For eachin run in list2(" + times + ") and list1(" + (times / 10000) + ")"
time = MilliSecs()
For Local f:Ttest = EachIn list2
f.id:+1
For Local v:Ttest = EachIn list
v.id:+1
Next
Next
Print (MilliSecs() - time) + "ms"

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group