Высокая производительность клонирования - PullRequest
8 голосов
/ 19 августа 2011

Я стремлюсь к глубокому клонированию графов объектов в удобной форме. Я собираюсь создать несколько потоков, которые будут клонировать график очень быстро, чтобы они могли играть с каким-то состоянием и отбрасывать результаты, если они не интересны, возвращаясь к оригиналу, чтобы повторить попытку.

В настоящее время я использую глубокий клон через двоичную сериализацию, которая хотя и работает, но не удивительно быстро. Я видел другие библиотеки, такие как protobuf, но классы в моем графе объектов могут быть определены во внешних сборках, наследуясь от классов в основной сборке, и не хотят добавлять сложность в эти потребляющие сборки, если это возможно.

Одной из интересных вещей, с которыми я столкнулся, было клонирование с использованием автоматически сгенерированного IL . Кажется, он еще не закончен, и я написал, чтобы узнать, сделал ли автор что-то еще, но я думаю, нет. Кто-нибудь еще разработал или видел более полнофункциональный способ глубокого клонирования через IL? Или другой метод, который будет быстрым?

1 Ответ

3 голосов
/ 19 августа 2011

Кроме сериализации, я рассматриваю только три варианта:

  • Придерживайтесь сериализации, но настраивайте ее.Это может быть полезно, если вы хотите декларативно скопировать вещи и есть очень вероятные приросты производительности.
  • Обход объекта на основе отражения в сочетании с эмиттером IL, таким как Fasterflect .
  • Создавайте код или кодируйте свое собственное клонирование, буквально присваивая свойства друг другу (у нас есть некоторый старый код, который использует для этого то, что мы называем конструктором копирования, берет свой экземпляр и вручную копирует свойства /поля через).

У нас есть несколько примеров кода, где мы контролируем двоичную сериализацию, чтобы мы могли сериализовать внутреннюю таблицу GUID (у нас есть много повторяющихся GUID и сериализовать очень большие списки через .NET Remoting).Он хорошо работает для нас, и нам не нужна сторонняя инфраструктура сериализации, однако, это ручная работа с небольшим кодом.

CSLA.NET framework имееткласс с именем UndoableBase, который использует отражение для сериализации Hashtable значений свойства / поля.Используется для разрешения откатов объектов в памяти.Это может соответствовать вашему предложению «вернуться к оригиналу, чтобы повторить попытку».

Лично я бы посмотрел дальше на решение, основанное на отражении (предпочтительно с испускаемым IL для лучшей производительности), тогда это позволит вам воспользоватьсяатрибутов класса / члена для контроля над процессом клонирования.Если производительность - король, это не может сократить ее.

...