Mam kolekcję obiektów i próbuję sklonować tę kolekcję i próbować zrozumieć wpływ różnych podejść na wydajność.Wydajność DeepClone (przy użyciu serializacji binarnej) a ręczne ustawianie właściwości
Obiekt w kolekcji ma około 20 właściwości wszystkich ciągów, int, float (ten obiekt nie zawiera żadnych obiektów zagnieżdżonych). Oba podejścia są:
Tworzenie DeepClone() metoda:
public static class ExtensionMethods { public static T DeepClone<T>(this T a) { using (var stream = new MemoryStream()) { var formatter = new BinaryFormatter(); formatter.Serialize(stream, a); stream.Position = 0; return (T)formatter.Deserialize(stream); } }
}
ręcznie napisać "kopia" kodu, gdzie jestem zapętlenie poprzez zbieranie i "nowych" ing nowy obiekt, a następnie ręcznie ustawiając wszystkie z 20 właściwości. coś takiego
public MyObject Copy(MyObject myObj) { var obj = new MyObject(); obj.Prop1 = myObj.Prop1; obj.Prop2 = myObj.Prop2; return obj;
}
Dostaję bardzo niespójne wyniki, więc chciałem się narodów opinię na temat:
Trzeba być znacznie szybciej niż inne? Pomyślałbym o wyborze drugim, ale moje testy nie wspierają tego, więc próbuję ustalić, czy robię coś złego.
Czy można to zrobić jeszcze szybciej?
Nie jestem pewien, dlaczego nazwałeś ten DeepClone(), gdy chcesz tylko wykonać płytkie kopiowanie. Ponieważ ciągi są niezmienne, płytka kopia napisu jest odpowiednikiem głębokiej kopii. Ponadto ręczne ustawianie musi być znacznie szybsze, ponieważ BinaryFormatter używa odbicia, aby uzyskać nazwy właściwości, setery, konstruktory itp. – Gleno
@Gelno - ta metoda pogłębiłaby Klonowanie obiektu, gdyby zawierał w nim zagnieżdżone obiekty (stąd nazwa) – leora