Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

31.07.2014, 13:10

Lambda an sich fügt der SPRACHE C# natürlich sogar sehr viel hinzu.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

12

31.07.2014, 17:19

Lambdas können auch deutlich besser vom Compiler optimiert werden. *klick*

MfG
Check

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Checkmateing« (31.07.2014, 19:55)


Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

13

31.07.2014, 17:35

Wo hast du die Aussage her?
In C++ könnte ich mir das vielleicht leicht vorstellen, weil der Compiler mehr inlinen könnte, weil die Funktion garantiert nirgendwo sonst verwendet wird und in der Compileunit definiert ist. Wenn man die Funktionen aber entsprechend markiert und in den Header schiebt, wäre das aber auch der Fall. Allgemein wäre ich mit der Aussage äußerst vorsichtig und sollte sich nicht all zu viel geben.

Ohne es validiert zu haben, würde es mich ehrlich gesagt sehr sehr stark wundern, wenn C# bzw. der JIT eine derartige Umformung durchgeführen kann. Ich würde befürchten, dass das knall hart in allen Fällen in die relativ teuren indirekten Funktionsaufrufe umgesetzt wird. Selbst in Spezialfällen: Dass es gar schneller ist, halte ich für noch unwahrscheinlicher. Wenn man beschleunigen will, sollte man besser in den meisten Fällen auf Delegates ganz verzichten und statische Methoden verwenden.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (31.07.2014, 17:52)


14

31.07.2014, 17:46

Lambdas können auch deutlich besser vom Compiler optimiert werden.
Wieso das? Also da würde mich mal der Hintergrund interessieren. Wenn das Zeug ein bisschen läuft, inlined der JIT-Compiler Lambdas als auch anonyme Klassen. Am Anfang sind Lamdas im Vergleich zu anonymen Klassen natürlich schneller, bis dahin stimme ich Dir also zu. Direkte Methodenaufrufe ohne anonyme Klassen, wenn man z.B. einen Listener direkt in der Hauptklasse implementiert, sollten aber immer schneller und leichter zu optimieren sein.

edit: ah Spiele Programmierer war schneller.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

15

31.07.2014, 18:01

Wo hast du die Aussage her?
In C++ könnte ich mir das vielleicht leicht vorstellen, weil der Compiler mehr inlinen könnte, weil die Funktion garantiert nirgendwo sonst verwendet wird und in der Compileunit definiert ist.
Aehh nein, wie soll das gehen? Wenn ich z.b. eine find Funktion in meiner CTest klasse habe, die so ungefaehr wie BCs Beispiel aussieht, dann erzeugt der Compiler genau einen Code. Dieser muss beliebige viele Funktionen aufrufen, die sonstwo definiert werden koennen um in der Suche das variable Suchkriterium abzutesten. Optimiert werden kann da dann hoechstens noch zur Linkzeit. Habe ich hingegen als Vergleich mal eine find Funktion als template, dann wird die find Funktion für jedes Kriterium neu kompiliert (darum muss die find Funktion dann auch in den Header) und koennte dann auch auf jedes Kriterium speziall optimiert werden.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

16

31.07.2014, 18:18

Zitat von »TGGC«

find Funktion als template [...]

Korrekt, allerdings ist das genau wie C++ Lambas funktionieren. C++ Lambdas sind bloß ganz normale Objekte/anonyme Klassen mit überladenen Klammer-Operator. Dieser Code zum Beispiel arbeitet in C++ mit Lambda und alles zur Compilezeit bekannt... Lambdas arbeiten perfekt mit Templates zusammen und das ist wie alle STL Standardalgorithmen implementiert sind. Man kann ein Lambdaobjekt übergeben und der Code wird speziell dafür kompiliert und ist kann ganz normal geinlined oder sonst was werden. Du darfst hier C++11 Lambdas nicht mit "Delegates", Funktionszeigern und diesem vergleichsweise super-teuren-"std::function"s verwechseln.

Der zugegebenermaßen theoretische Vorteil den ich meinte ist einfach bloß, dass bei einem Lambda der Compiler relativ einfach ohne Link-Time-Optimierungen nachweisen kann, dass ein Lambda zum Beispiel garantiert nur an zwei Stellen verwendet wird. Zum Beispiel dadurch könnte er sich dazu animiert füllen, dass die Methode geinlined werden könnte. Ähnliche wie globale freie Methoden die mit "static" ausgezeichnet sind, pro Compile Unit definiert sind und deshalb dem Compiler zum inlinen animieren.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

31.07.2014, 18:56

[...] Ähnliche wie globale freie Methoden die mit "static" ausgezeichnet sind, pro Compile Unit definiert sind und deshalb dem Compiler zum inlinen animieren.

Kleiner Hinweis am Rande: Diese Verwendung von static ist ein Relikt aus C; in C++ gibt's dafür unnamed namespaces ;)

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

18

01.08.2014, 00:50

Zitat von »TGGC«

find Funktion als template [...]

Korrekt, allerdings ist das genau wie C++ Lambas funktionieren. C++ Lambdas sind bloß ganz normale Objekte/anonyme Klassen mit überladenen Klammer-Operator. Dieser Code zum Beispiel arbeitet in C++ mit Lambda und alles zur Compilezeit bekannt... Lambdas arbeiten perfekt mit Templates zusammen und das ist wie alle STL Standardalgorithmen implementiert sind. Man kann ein Lambdaobjekt übergeben und der Code wird speziell dafür kompiliert und ist kann ganz normal geinlined oder sonst was werden. Du darfst hier C++11 Lambdas nicht mit "Delegates", Funktionszeigern und diesem vergleichsweise super-teuren-"std::function"s verwechseln.
Kleiner Tipp, du solltest dir das nochmal genauer anschauen und durchdenken, damit du hier nichts verwechselst...

19

01.08.2014, 11:02

Guten Morgen,

danke erstmal für die Erklärungen. Ich habe mittlerweile eine Klasse gebaut die Lambdas und Events benutzt und ich denke ich habe Lambdas nun grob verstanden.

Grüße

WhySoSad

Werbeanzeige