lunes, 21 de enero de 2013

Clone Wars (o el arte de clonar objetos). Parte 2

Con algo de retraso continuo analizando métodos para clonar objetos, esta vez rebuscando por la red, en busca de algo diferente a lo habitualmente usado que se expuse en la primera entrada (http://serginet.blogspot.com.es/#!/2012/12/clone-wars-o-el-arte-de-clonar-objetos.html).

Clonado IL


Para empezar, clonado mediante código intermedio, es de ir IL. Parece rebuscado, pero promete buen rendimiento. Su autor (Whizzo) da detalles aquí: http://whizzodev.blogspot.com.es/2008/03/object-cloning-using-il-in-c.html

Una prueba rápida arroja excelentes resultados... peeero, el método no vale para hacer un deep cloning de colecciones (una lista de objetos dentro de tu objeto). El autor aún no lo haimplementado, y va pasando el tiempo :-(.  Quizás algún día me ponga a ello, pero por ahora vamos a descartar este método.

Clonado con serialización binaria alternativa


Si, podemos encontrar otros serializadores además de los que vienen con .NET Framework. Por ejemplo, neocognitron nos propone su AltSerializar, que hace una serialización binaria en principio más eficiente que la ofrecida de serie por Microsoft.

Su uso es sencillo, basta con referenciar el assembly, y serializar del siguiente modo:


   1:  using System.Text;
   2:   
   3:  byte[] bytes = Serializer.Serialize(source);
   4:  var res= (T)Serializer.Deserialize(bytes);
   5:  TraceTime();
   6:  return res;

¿Que tal el rendimiento?

Pues aquí lo podéis ver:





He utilizado el mismo método que en la primera parte entrada de Clone Wars: Clonamos 1000,10000, 25000 y 50000 objetos tres veces, sacando la media de tiempos.

Como veis, tenemos los tipos de clonado de la primera parte del artículo (Reflection y Serializacion), el clonado con serialización alternativa, y además he añadido el clonado manual (¡Ya sabíamos que iba a ser el más rapido!)

Como veis parece que este serializador alternativo es rápido, muy rápido, incluso más que la serialización con reflection. ¡Buen candidato!

Además hay que tener en cuenta que se le pueden "tocar las tripas"... seguro que podríamos mejorar.

Conclusiones


Una vez visto esto, modifico las conclusiones que saqué en la primera parte del artículo para decir: Implementa un clonado manual siempre que puedas, es decir, siempre que tengas pocas clases, o en caso contrario suficiente tiempo para hacerlo con seguridad, es decir, con pruebas unitarias que aseguren que no "metes la pata".

Si esto anterior no puede ser, opta por el clonado con el serializador alternativo que hemos visto aquí.

Aqui os dejo el código fuente, en el que incluyo también el clonado IL. Ya comenté que no clona colecciones, quizas alguien se anima!


http://sdrv.ms/SrTa4F

Continuare en breve (me pongo a escribir ahora mismo) con la parte 3 del artículo: Clone Wars: El Bombazo Final...