Thomas Woelfers Baustatik Blog

Baustatik-Software und was sonst des Weges kommt

Schleimproduktion eingestellt

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.

Comments (2) -

  • hans kalmann

    5/11/2006 5:18:57 AM |

    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

  • thomas woelfer

    5/11/2006 11:14:40 AM |

    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...)

Comments are closed