Geschwindigkeit: 10000 delegates oder Referenzen in Liste

13/03/2009 - 09:54 von jh | Report spam
Hallo,

ich möchte wissen, welche Variante schneller ist.

Variante 1:
Bei Änderung wird ein Objekt in eine Liste eingefügt. Dann wird diese Liste
iteriert und von allen Objekten Methoden aufgerufen. Am Ende wird die Liste
gelöscht.

Variante 2:
Bei Änderung wird ein Delegate erstellt und zu einem MulticastDelegate
hinzugefügt.
Am Ende startet der MulticastDelegate und löst alle Events aus.

Das ganze passiert etwa alle 50ms mit etwa 10000 Objekten. Bei Variante 1
wird nichts mit "new" angelegt.

Vielen Dank. jh
 

Lesen sie die antworten

#1 Günter Prossliner
13/03/2009 - 12:56 | Warnen spam
Hallo jh!

Wir benutzen in dieser Gruppe für gewöhnlich Real-Namen.

Variante 1:
Bei Änderung wird ein Objekt in eine Liste eingefügt. Dann wird diese
Liste iteriert und von allen Objekten Methoden aufgerufen. Am Ende
wird die Liste gelöscht.



Wenn ich Dich richtig verstanden habe, wird die Methode direkt aufgerufen.
Also ohne Event / Delegates oder was auch immer. Ist das eine virtuelle
Methode bzw. wird diese über ein Interface aufgerufen?

Variante 2:
Bei Änderung wird ein Delegate erstellt und zu einem MulticastDelegate
hinzugefügt.
Am Ende startet der MulticastDelegate und löst alle Events aus.



Also ein Delegate mit ~ 10000 Eintràgen in der Invokation-List?



Da Variante 1 keine Delegate-Aufrufe benötigt (sondern maximal einen
virtuellen Aufruf aus dem v-table), ist das auf jeden Fall effizienter wie
Variante 2. Wenn Du die Methode kennst, und nicht wahlfrei neue Methoden in
die Auflistung hinzufügen musst - wofür ein Event gedacht ist (obwohl es
mittels Interfaces / virtuellen calls ja auch möglich wàre), solltest Du den
Overhead eines Delegate Aufrufs vermeiden.

Obwohl in steigenden Versionen der CLR / JIT die Delegate Aufrufe sehr
optimiert wurden, sind diese immer noch um einiges langsamer wie normale
Aufrufe (nur Reflection Aufrufe sind noch aufwendiger). Das wird auch immer
so sein, da einfach bei einem Delegate-Aufruf mehr zu machen ist (wobei das
auch davon abhàngt ob der Delegate ein oder mehrere Targets beinhaltet).

Du kannst ja ein kleines Programm schreiben welches die Durchlaufszeiten
misst, und diese dann (für Deinen konkreten Fall) vergleichen.


OK?
mfg GP

Ähnliche fragen