Objekteigenschaften kopieren: Reflektion oder Serialisierung - was ist schneller?

8

Ich habe zwei Objekte des gleichen Typs und muss Eigenschaftswerte von einem Objekt in ein anderes kopieren. Es gibt zwei Möglichkeiten:

  1. Verwenden Sie die Reflektion, navigieren Sie durch die Eigenschaften des ersten Objekts und kopieren Sie die Werte.

  2. Serialisieren Sie das erste Objekt und deserialisieren Sie eine Kopie.

Beide arbeiten für meine Anforderung, die Frage ist, welche verwende ich besser in Bezug auf die Geschwindigkeit (Kosten)?

Beispiel

%Vor%

Sie müssen Eigenschaftswerte von Person p1 nach Person p2 kopieren.

Für dieses einfache Beispiel - welche Methode ist schneller?

Aktualisieren

Für die Serialisierung verwende ich den hier vorgeschlagenen ObjectCopier: Deep cloning objects

>

Zur Reflexion verwende ich diesen Code:

%Vor%     
net_prog 18.11.2011, 11:14
quelle

5 Antworten

10

Alles hängt davon ab, was Sie kopieren möchten und welche Art von Serialisierer Sie verwenden möchten. Thing mit Serializern ist, einige von ihnen könnten tatsächlich Reflexion als zugrunde liegenden Mechanismus zum Erstellen von Objekten verwenden.

Edit # 1: Soweit ich weiß, verwendet BinaryFormatter , das von Ihrer Klasse verwendet wird, die Reflektion, um ihre Arbeit zu erledigen. Also Frage ist, können Sie besser (schneller?) Benutzerdefinierte Reflexion Code für Ihre Typen als Microsoft für allgemeine Szenario?

schreiben

Edit # 2: Aus Neugierde habe ich einen einfachen Test durchgeführt. BinaryFormatter vs Reflexion in Bezug auf die Ausführung seichter Kopie . Der verwendete Reflexionscode kann hier eingesehen werden:

%Vor%

Was sind die Ergebnisse im Vergleich zur ObjectCopier Klasse, die Sie verwenden? Reflection scheint 7-mal schneller zu sein als Serialisierungscode. Dies gilt jedoch für Person class mit öffentlichen Feldern . Bei Eigenschaften ist der Unterschied immer noch bemerkbar, aber es ist nur 2 mal schneller.

Ich nehme an, dass der Unterschied von der Tatsache herrührt, dass BinaryFormatter Streams verwenden muss, die zusätzlichen Overhead verursachen. Aber das ist nur meine Annahme, die weit von Fakten entfernt sein könnte.

Quellcode für das Testprogramm, das ich verwendet habe, kann hier gefunden werden. Jeder ist willkommen, Fehler und mögliche Probleme damit zu zeigen: -)

Randnotiz
Wie bei allen "Ich habe mich gefragt ..." Benchmarks, schlage ich vor, Sie nehmen es mit einem Körnchen Salz. Solche Optimierungen sollten nur dann vorgenommen werden, wenn ihre Leistung tatsächlich zum Problem wird.

    
k.m 18.11.2011, 11:32
quelle
7

Letztendlich verwenden Allzweck-Serialisierer (wie BinaryFormatter , via ObjectCopier ) die Reflexion . Wie gut sie verwenden, hängt vom spezifischen Serializer ab, aber es gibt immer einen zusätzlichen Aufwand, wenn Sie serialisieren.

Da Sie nur eine flache Kopie möchten, ist ein Werkzeug wie AutoMapper das am besten geeignete Werkzeug hier; Auch hier wird Reflektion verwendet (aber ich erwarte, dass es "den richtigen Weg" geht, d. h. nicht via GetValue() / SetValue() ), aber es hat keine Serialisierungskosten.

In diesem Szenario ist die Serialisierung übertrieben; AutoMapper ist vollkommen in Ordnung. Wenn Sie Deep-Clones wollten, wird es schwieriger ... Serialisierung könnte verlockend sein. Ich würde wahrscheinlich noch nicht BinaryFormatter selbst wählen, aber ich bin sehr pingelig in Bezug auf die Serialisierung; p

Es wäre natürlich trivial, einige grundlegende Reflektionen zu korrigieren, die dasselbe über GetValue() etc tun, aber das wäre langsam. Eine andere interessante Option ist hier, dass Sie die Expression API verwenden können, um einen Objektkopierer zur Laufzeit zu erstellen .... aber ... AutoMapper tut alles, was Sie hier brauchen, also scheint es redundanter Aufwand.

    
Marc Gravell 18.11.2011 11:42
quelle
0

Binäre Serialisierung ist sehr schnell Ich benutze es sehr für diese Art von Problem

Deep cloning objects

    
remi bourgarel 18.11.2011 11:19
quelle
0

Wenn Sie die Eigenschaften während der Laufzeit kopieren, ist die Reflektion die Antwort. Ich würde für die Serialisierung gehen, wenn es nicht zur Laufzeit ist. Serialisierung gegen Reflexion schau dir das einmal an.

    
nebula 18.11.2011 11:20
quelle
0
%Vor%     
Tnqiang Ren 10.08.2017 05:41
quelle