Frage

Einige Leute haben argumentiert, dass die C # 4.0-Funktion mit dem dynamic Schlüsselwort eingeführt ist die gleiche wie die Funktion von VB „alles, was ein Objekt ist“. Allerdings wird jeder Anruf auf einer dynamischen Variable in einen Delegaten einmal und von da an übersetzt werden, wird der Delegat genannt. In VB, wenn Object verwendet wird, wird kein Cache angelegt und jeder Anruf auf einem nicht typisierten Verfahren beinhaltet eine ganze Reihe von unter der Motorhaube Reflexion, manchmal eine satte 400-fache Leistungseinbuße in Höhe von.

Haben Sie die dynamische Typ Delegat-Optimierung und Caching auch die VB untypisierten Methodenaufrufe hinzugefügt wurden, oder ist nicht typisierte Objekt VB noch so langsam?

War es hilfreich?

Lösung

Lösung

Einige Forschung und eine bessere Lektüre der früher Artikel genannten von Hans Passant erwähnt, bewirkt der folgenden Schlussfolgerung:

  • VB.NET 2010 unterstützt das DLR;
  • Sie können IDynamicMetaObjectProvider implementieren, wenn Sie explizit Dynamik unterstützen wollen, wird der VB.NET-Compiler erkennen aktualisiert, dass;
  • VB Object wird nur das DLR und Verfahren Caching verwenden, wenn das Objekt implementiert IDynamicMetaObjectProvider;
  • BCL und Framework-Typen nicht implementieren IDynamicMetaObjectProvider, mit Object auf solche Typen oder Ihre eigenen Typen wird die klassische, nicht im Cache gespeichert VB.NET late-Binder aufrufen.

Hintergrund: Erarbeitung, warum Caching späte Bindung VB-Code Leistung helfen könnte

Einige Leute (darunter Hans Passant, sehen seine Antwort) kann sich fragen, warum Caching oder nicht-Caching in späte Bindung könnte möglicherweise Angelegenheit. Eigentlich macht es einen großen Unterschied, sowohl in VB und in anderen später Bindung Technologien (erinnert IQueryInterface mit COM?).

Spät-Bindung kommt zu einem einfachen Prinzip nach unten: einem Namen und seine Parameter-Erklärungen gegeben, eine Schleife durch alle Methoden dieser Klasse und ihre übergeordneten Klassen mit Hilfe von Methoden zur Verfügung, obwohl die Type Schnittstelle (und in VB, ein Verfahren , eine Eigenschaft und ein Feld Look die gleiche, so dass dieser Prozess noch langsamer). Wenn Sie diese Methode Tabellen betrachten sind ungeordnet, dann ist diese leicht viel teurer als ein einzelner direkter ist (das heißt, typisierte) Methodenaufruf.

Wenn Sie einmal die Methode des Nachschlagen der Lage sind, und dann den Methode-Zeiger in einer Lookup-Tabelle zu speichern, würde dies erheblich beschleunigt diesen Prozess. Cached-Methode in der DLR-Bindung geht noch einen Schritt futher und ersetzt den Methode-Aufruf mit einem Zeiger auf das eigentliche Verfahren, wenn möglich. Nach dem ersten Aufruf, wird dies eine Größenordnung schneller für jeden nachfolgenden Aufruf (man denke 200x 800x mal schneller).

Als Beispiel, wenn diese Angelegenheiten, hier ist ein Code, der dieses Problem veranschaulicht. In einem Fall, in dem jede Klasse eine .Name String-Eigenschaft hat, aber die Klassen nicht einen gemeinsamen Vorfahren oder Schnittstelle gemeinsam nutzen, können Sie naiver Art Listen einer dieser Typen wie folgt:

' in the body of some method '
List<Customers> listCustomers = GetListCustomers()
List<Companies> listCompanies = GetListCompanies()

listCustomers.Sort(MySort.SortByName)
listCompanies.Sort(MySort.SortByName)

' sorting function '
Public Shared Function SortByName(Object obj1, Object obj2) As Integer
    ' for clarity, check for equality and for nothingness removed '    
    return String.Compare(obj1.Name, obj2.Name)    
End Function

Dieser Code (ähnlich zumindest) tatsächlich machte es in der Produktion mit einem meinen Kunden und wurde in einem oft genannten AJAX Callback verwendet. Ohne manuell die .Name Eigenschaften Cachen, bereits auf mittelgroße Listen von weniger als einer halben Million Objekte, die späte Bindung Code wurde solch eine spürbare Belastung, dass es schließlich die ganze Seite nach unten gebracht. Es erwies sich als schwierig, diese Frage auf die Spur, aber das ist eine andere Geschichte. Nach dieser Fixierung gewann die Website 95% seiner CPU resouces.

Also, die Antwort auf Hans Frage „haben Sie nicht größere Probleme zu befürchten“ ist einfach: Das ist ein großes Problem ist (oder sein kann), esp. VB-Programmierer, die zu sorglos bekommen haben späte Bindung zu verwenden.

In diesem speziellen Fall, und viele wie sie, VB.NET 2010 offenbar wurde späte Bindung nicht aufgerüstet einzuführen, und als solche, Object bleibt Übel für die nicht bewusst und soll nicht mit dynamic verglichen werden.

PS:. Späte Bindung Performance-Probleme sehr schwer aufzuspüren, wenn Sie eine gute Leistung Profiler haben und wissen, wie spät-Bindung umgesetzt wird intern durch den Compiler

Andere Tipps

Zitiert aus dem , was neu Artikel :

  

Visual Basic 2010 wurde aktualisiert, um   voll unterstützen, seine das DLR in   latebinder

Kann nicht mehr explizit als die. Es ist das DLR, dass Geräte des Caching.

Gute Frage. Ich vermute, die Antwort ist „Nein“, weil dieser Artikel in MSDN Magazin sagt VB.Net die Dynamic Language Runtime, und wird kurz beschrieben, Änderungen an der Laufzeit aber nicht erwähnt Caching zur Unterstützung geändert wurde.

Wer weiß besser?

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