Actualmente estoy investigando el uso de db4o como almacenamiento para mi aplicación web. Estoy bastante contento de lo fácil que funciona db4o. Entonces, cuando leo sobre el enfoque de Code First que me gusta, es porque la forma de trabajar con EF4 Code First es bastante similar a trabajar con db4o: crear objetos de dominio (POCO), lanzarlos a db4o y nunca mirar hacia atrás.¿Por qué el código EF4 primero es tan lento cuando se almacenan objetos?
Pero cuando hice una comparación de rendimiento, EF 4 fue terriblemente lento. Y no pude entender por qué.
que utilice las siguientes entidades:
public class Recipe { private List _RecipePreparations; public int ID { get; set; } public String Name { get; set; } public String Description { get; set; } public List Tags { get; set; } public ICollection Preparations { get { return _RecipePreparations.AsReadOnly(); } }
public void AddPreparation(RecipePreparation preparation)
{
this._RecipePreparations.Add(preparation);
}
}
clase pública RecipePreparation { Nombre de la cadena pública {get; conjunto; } public String Descripción {get; conjunto; } public int Rating {get; conjunto; } public List Steps {get; conjunto; } public List Tags {get; conjunto; } public int ID {get; conjunto; }}
Para probar el rendimiento I nuevo una receta, y añadir 50.000 RecipePrepations. Entonces almacenado el objeto de db4o así:
IObjectContainer db = Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), @"RecipeDB.db4o");
db.Store(recipe1);
db.Close();
Esto toma alrededor de 13.000 (ms)
almaceno las cosas con EF4 en SQL Server 2008 (Express, localmente) como este:
cookRecipes.Recipes.Add(recipe1);
cookRecipes.SaveChanges();
y que lleva 200.000 (ms)
Ahora, ¿cómo en la tierra es db4o 15 (!!!) veces más rápido que EF4/SQL? ¿Me estoy perdiendo un botón turbo secreto para EF4? Incluso creo que db4o podría hacerse más rápido? Como no inicializo el archivo de la base de datos, simplemente lo dejo crecer de forma dinámica.
Mi conjetura es que la sobrecarga de muchos insert-declaraciones individuales en ejecución es la porción más grande de la diferencia. ¿Hay alguna manera de instruir a EF4 para que combine las instrucciones de inserción para reducir esa sobrecarga? –
@Lasse: Sí, lo hay. EF implementa el patrón de la unidad de trabajo de la caja: mira mi respuesta. –
He hecho algunos perfiles con Visual Studio. Y el cookRecipes.Recipes.Add (receta1) toma aproximadamente el 65% del tiempo total para almacenar, y SaveChanges aproximadamente el 35% (duh ...;)). – Saab