Hochleistungsklonen

8

Ich bin auf der Suche nach einem Mittel, um einen Objektgraphen in perfekter Weise zu klonen. Ich werde mehrere Threads haben, die ein Diagramm extrem schnell klonen, so dass sie mit einem bestimmten Zustand spielen und die Ergebnisse wegwerfen können, wenn sie nicht interessant sind, und zum Original zurückkehren, um es erneut zu versuchen.

Ich benutze derzeit einen tiefen Klon über binäre Serialisierung, die, obwohl sie funktioniert, nicht erstaunlich schnell ist. Ich habe andere Bibliotheken wie protobuf gesehen, aber die Klassen in meinem Objektdiagramm können in externen Assemblys definiert werden, die von Klassen in der Haupt-Assembly erben und keine Komplexität in diesen konsumierenden Assemblys hinzufügen wollen, wenn dies möglich ist.

Eines der interessanten Dinge, auf die ich gestoßen bin, war das Klonen mit automatisch generierte IL . Es scheint, dass es noch nicht ganz fertig ist und ich habe geschrieben, um zu sehen, ob der Autor mehr getan hat, aber ich vermute nicht. Hat jemand anderes eine funktionellere Art des Klonens über IL entwickelt oder gesehen? Oder eine andere Methode, die schnell sein wird?

    
Ian 19.08.2011, 14:57
quelle

1 Antwort

3

Neben der Serialisierung betrachte ich nur drei Optionen:

  • Bleiben Sie bei der Serialisierung, aber passen Sie sie an. Dies kann nützlich sein, wenn Sie Dinge deklarativ ablegen wollen und sehr wahrscheinlich Leistungsgewinne haben.
  • Reflektionsbasiertes Objekt-Walking in Verbindung mit einem IL-Emitter wie Fasterflect .
  • Codegenerieren oder codieren Sie Ihr eigenes Klonen, indem Sie sich gegenseitig Eigenschaften zuweisen (wir haben etwas alten Code, der dafür einen Kopierkonstruktor verwendet, eine Instanz von sich selbst nimmt und die Eigenschaften / Felder manuell kopiert) .

Wir haben einige Instanzen von Code, wo wir die binäre Serialisierung kontrollieren, so dass wir eine interne GUID-Tabelle serialisieren können (wir haben viele wiederholte GUIDs und serialisieren sehr große Listen über .NET Remoting). Es funktioniert gut für uns und wir haben kein Serialisierungsframework von Drittanbietern benötigt, aber es ist handgefertigtes Zeug mit ein wenig Code-Gen.

Das CSLA.NET-Framework enthält eine Klasse namens UndoableBase , die die Reflektion verwendet, um ein Hashtable der Eigenschaft zu serialisieren / Feldwerte. Wird verwendet, um Rollbacks für Objekte im Speicher zu ermöglichen. Dies könnte zu Ihrem Satz "Zurück zum Original, um es erneut zu versuchen" passen.

Persönlich würde ich mich weiter mit einer reflexionsbasierten Lösung (vorzugsweise mit emittierter IL für eine bessere Leistung) befassen, die es Ihnen dann ermöglicht, Klassen- / Mitgliedsattribute für die Kontrolle über den Klonprozess zu nutzen. Wenn Leistung die Königsklasse ist, kann es nicht schneiden.

    
Adam Houldsworth 19.08.2011, 15:01
quelle

Tags und Links