Frage

Ich spiele mit dem DLR ein besseres Verständnis davon zu bekommen. Ich bin nicht völlig vertraut und doch mit allen ihren Konzepten und ihrer Terminologie so sorry für jegliche terminologischen oder konzeptionelle Fehler in meiner Frage.

Grundsätzlich ist die Art, wie ich es verstehe, ist, dass man um Objekte in Ausdruck Bäumen passieren, aber sie verwenden Bindemittel, um Ihre Objekte dynamische Funktionalität zu anderen DLR-fähigen Sprachen verfügbar zu machen. Anstatt also eine Ergänzung zu tun, zum Beispiel direkt im Ausdrucksbaum (Mit Expression.Add) erstellen Sie ein Bindemittel, das von der Aufrufstelle aufgerufen wird, wenn es benötigt wird, und macht den Zusatz für Sie.

Da Sie Objekte in der Umgebung passieren, am Ende der Additionsoperation (wenn die Operanden sind, beispielsweise zwei Int32-Wert) können Sie das resultierende Int32 zu einem Objekt, da (noch im Bindemittel) müssen Kasten, was der Aufrufort erwartet. Ich bin ein bisschen Angst, dass diese Konstante Boxen / Unboxing könnte die Leistung der Laufzeit beeinflussen etwas.

Ist das wirklich, wie es funktionieren soll (mit allen Boxen / Unboxing) oder bin ich etwas fehlt?

War es hilfreich?

Lösung

In einer dynamisch typisierte Sprache, die Identifizierung und Optimierung eines statisch typisierte Variable ist eine domänenspezifische Optimierung. Innerhalb eines bestimmten dynamischen Umsetzung der Sprache X, könnten Sie ein unboxed lokalen Variable in generierten Code zu halten, aber sobald Sie ein dynamisch typisierte API aussetzen, gibt es keine Möglichkeit, statische Typisierung zu gewährleisten (die Natur der dynamischen Sprachen).

Boxen zu vermeiden, müssen Sie Teile des Codes identifizieren, die Sie im gesamten statischen Typen nachweisen können, und generieren Code speziell für sie entweder durch Linq.Expressions oder ILGenerator.

Andere Tipps

Was die Bindemittel gehen Sie können auch eine benutzerdefinierte Bindemittel implementieren. Das benutzerdefinierte Bindemittel kann entweder zurückgeben einen nicht-Objekttyp oder andere spezifische Optimierungen tun. In ues Ironpython wir die DLR äußere Schicht ComboBinder und ComboActionRewriter conditionals zu optimieren. Zum Beispiel: „Wenn a.b:“ in ein ComboBinder drehen kann, die tun sowohl die a.b und die Konvertierung in bool. Wenn a.b Ergebnisse in einem nicht-geschachtelte Bool werden wir die Boxen und Unboxing vermeiden. Wir planen, weitere Optimierungen wie diese auf dem Experimentieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top