Schleimproduktion eingestellt

25. April 2006 16:32
Nachdem ich mich fast die gesamte letzte Woche eigentlich nur mit der Produktion von Schleim befasst habe, bin ich nun so langsam wieder auf dem damm - und wollte von einem "netten" bug berichten, der mich heute einige stunden gekostet hat.

Im Faltwerksprogramm gibt es ein Modell, das es erlaubt, beliebige Eigenschaften von beliebien Objekten zu beliebigen Zeitpunkten zu verändern. Dazu gibt es in jedem Objekt eine Liste von "Clients" - diesen Clients wird mitgeteilt, wenn es eine Änderung an einer Eigenschaft eines Objektes gab. Das kann man dann z.b. benutzen, um die Darstellung des Objektes anzupassen und ähnliches.

Wird ein Objekt gelöscht, dann wird die Liste der Clients geleert. Bis vor kurzen sah der Code dazu wie folgt aus:

while( clients.Count > 0) { clients[0].Disconnect(); }

Im Zuge des Disconnect() trägt sich der Client aus der Liste "clients" aus. Aus Performance-Gründen hatten wir diese Code wie folgt abgeändert:

while( clients.Count > 0) { clients[clients.Count-1].Disconnect(); } Resultat: Sehr merkwürdige Abstürze an unerwarteten Stellen. Was war passiert?

Man sollte meinen, das die vorgenommene Änderung keinerlei Auswirkungen haben kann - eben bis auf den Performance-Gewinn. Doch leider: Diese Änderung verändert tatsächlich die Semantik der ganzen Client/Server beziehung: Plötzlich bekommen die zuletzt erzeugten Clients Ihre "Disconnect()" Nachricht, bevor die ersten Clients die bekommen.

Schon komisch, wie sich eine Menge Arbeit hinter minimalen Änderungen verstecken kann.

Kommentare

11.05.2006 07:18:57 #

Will ja jetzt nicht wirken wie mr. ich weiss alles besser, aber war diese Verhaltensänderung nicht zu erwarten?

Der Code
"
while( clients.Count > 0) { clients[0].Disconnect(); }
"
löst einen Disconnect bei Client mit Index 0 im Array aus, bei einem sequentiellen Array (oder welcher sequentielle Typ auch immer), ist das der erste eingefügte Client, danach der Zweite, Dritte usw.


Der Code
"
while( clients.Count > 0) { clients[clients.Count-1].Disconnect(); }
"
hingegen schnappt sich immer den letzten Client im Array (Anzahl der Clients -1 = letzter Index der Sequenz).

Und warum sollte das die Performance steigern?
Gruss, HK

hans kalmann

11.05.2006 13:14:40 #

naja: wenn man das erste element rausnimmt, muss immer der rest des array umkopiert werden. nimmt man das letzte element raus, muss nichts umkopiert werden. (nciht, das ich das gemessen haette...)

thomas woelfer

Kommentare sind geschlossen

Kalender

<<  Mai 2012  >>
MoDiMiDoFrSaSo
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

View posts in large calendar