| Autor |
Nachricht |
Kha
        

Beiträge: 2965 Erhaltene Danke: 22 Dabei seit: 12.11.2005 Wohnort: Brackenheim
Win 7 F#, C# (VS2010)
|
Dass Delegates seit 2.0 alles andere als langsam sind, habe ich gehört. Trotzdem wollte ich lieber auf Nummer Sicher gehen, bevor ich meiner TestStopwatch-Klasse eine StressTest-Method verpasse, die einfach n-mal einen Delegate aufruft und die Zeit misst. Die Ergebnisse haben mich nicht bestätigt, sondern eher sprachlos gemacht...
Im Anhang noch das gesamte Projekt, da ich nicht erwarte, dass ihr mir das Ergebnis abkauft  .
PS: Delphi ist noch einmal 10% langsamer  .
Einloggen, um Attachments anzusehen!
|

|
|
Christian S.
        

Beiträge: 17543 Erhaltene Danke: 105 Dabei seit: 07.07.2002 Wohnort: Server-Souterrain
Win 7 Delphi Prism, C# (VS 2010)
|
Bei mir sind die Delegates zwar nicht schneller, aber auch nur unwesentlich (wahrscheinlich im Bereich der Messgenauigkeit) langsamer:
Auf jeden Fall mal ein interessanter Test!  Insbesondere in Multithreaded-Anwendungen braucht man Delegates ja ständig, um sie an Invoke zu übergeben 
_________________ I am of peace. Always.
Vom 9.9. bis 13.9. in Urlaub
|

|
|
Kha
        

(Threadstarter)
Beiträge: 2965 Erhaltene Danke: 22 Dabei seit: 12.11.2005 Wohnort: Brackenheim
Win 7 F#, C# (VS2010)
|
Oh lala, bin sogar mit angezogener Handbremse gefahren: Platform Target war zum Testen auf x86 gestellt.
Dynamischer Code ist demnach 5% schneller als statischer  . Auf einem anderen Rechner komme ich auf etwa den gleichen Wert - außer natürlich unter Mono  .
Der Asm-Code würde mich einmal interessieren, aber a) wüsste ich spontan nicht, wie man an ihn herankommt (über VS kann es ja nur mit angehängtem Debugger funktionieren) und b) würde ich mit dem Ergebnis sowieso nichts anfangen können  .
|

|
|
Robert_G
       
Beiträge: 415 Dabei seit: 06.02.2004 Wohnort: München
Delphi32 (D2005 PE); Chrome/C# (VS2003 E/A, VS2005)
|
Khabarakh hat folgendes geschrieben: | Dynamischer Code ist demnach 5% schneller als statischer |
Ist nicht dynamischer Code. Ist nur ein Zeiger auf den Code.
Delegates sind dann schneller, wenn sie auf virtuelle Methoden zeigen.
Denn beim zuweisen wird der virtual dispatch nur einmal ausgeführt und dann immer direkt die richtige Implementierung aufgerufen.
Das ist der gleiche Effekt wie bei Interfaces.
Aber: Delegates verhindern JIT-Optimierungen, und damit meine ich Inlining, da der JITter für andere Optimierungen zu dumm ist.
|

|
|
Kha
        

(Threadstarter)
Beiträge: 2965 Erhaltene Danke: 22 Dabei seit: 12.11.2005 Wohnort: Brackenheim
Win 7 F#, C# (VS2010)
|
Aber auch das ist doch kein Grund, dass sie schneller als inline Code sind, oder  ? Es kann doch eigentlich nur so sein, dass der assemblierte hunz normale Code auf irgendeine Art nicht optimal ist.
|

|
|
Robert_G
       
Beiträge: 415 Dabei seit: 06.02.2004 Wohnort: München
Delphi32 (D2005 PE); Chrome/C# (VS2003 E/A, VS2005)
|
Khabarakh hat folgendes geschrieben: | Aber auch das ist doch kein Grund, dass sie schneller als inline Code sind, oder ? Es kann doch eigentlich nur so sein, dass der assemblierte hunz normale Code auf irgendeine Art nicht optimal ist. |
Inlining auf Teufel komm raus kann die Anzahl der zu intialisierenden locals brachial erhöhen.
Es kann auch einfach sein, dass die statische Methode hinter dem delegate klein genug ist, so dass der JIT sie gut genug kapiert hat um den loop auszurollen, oder CPU Register nehmen konnte.
Der andere Code war ja innerhalb des Method bodies, die Delegates sind eigene Methoden.
|

|
|
Kha
        

(Threadstarter)
Beiträge: 2965 Erhaltene Danke: 22 Dabei seit: 12.11.2005 Wohnort: Brackenheim
Win 7 F#, C# (VS2010)
|
Ich muss mich wohl entschuldigen, mir ist gerade eben erst eingefallen, wie Closures eigentlich implementiert werden :duck: . So sieht das Ganze aus, nachdem jede Schleife ihre eigene x-Variable bekommt (= Die Inline-Loops wirklich lokale Variablen benutzen und nicht die autogenerierten Felder der Lambdas).
Während der erste Code also ein Inline<=>Delegate-Vergleich war (beide Male ldfld), war das nun eher ein ldloc<=>ldfld-Vergleich. Da man bei anonymen Methoden aber gebundene Variablen kaum vermeiden kann (schon allein, damit sie nicht einfach wegoptimiert werden), wird es wohl meistens auf den zweiten Fall herauslaufen, womit man bei meiner StressTest-Methode immer mit einem Overhead rechnen muss. Schade  .
|

|
|
Werbung ausblenden? Dann registriere Dich kostenlos.
Weitere Gründe für eine Registrierung.
Werbung ausblenden? Dann registriere Dich kostenlos.
Weitere Gründe für eine Registrierung.
|
|
|
|