【发布时间】:2011-03-21 13:39:39
【问题描述】:
我目前正在对我的 Web 应用程序使用 db4o 存储进行一些研究。我很高兴 db4o 的工作如此简单。因此,当我读到 Code First 方法时,我有点喜欢,因为使用 EF4 Code First 的方式与使用 db4o 非常相似:创建您的域对象 (POCO),将它们扔给 db4o,然后再也不回头。
但是当我进行性能比较时,EF 4 的速度非常慢。我不知道为什么。
我使用以下实体:
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);
}
}
public class RecipePreparation
{
public String Name { get; set; }
public String Description { get; set; }
public int Rating { get; set; }
public List Steps { get; set; }
public List Tags { get; set; }
public int ID { get; set; }
}
为了测试性能,我新建了一个配方,并添加了 50.000 个配方准备。然后我像这样将对象存储在 db4o 中:
IObjectContainer db = Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), @"RecipeDB.db4o");
db.Store(recipe1);
db.Close();
这大约需要 13.000(毫秒)
我将使用 EF4 的内容存储在 SQL Server 2008(Express,本地)中,如下所示:
cookRecipes.Recipes.Add(recipe1);
cookRecipes.SaveChanges();
这需要 200.000 (ms)
现在 db4o 到底如何比 EF4/SQL 快 15(!!!) 倍?我是否缺少 EF4 的秘密加速按钮?我什至认为 db4o 可以做得更快?由于我没有初始化数据库文件,我只是让它动态增长。
【问题讨论】:
-
我的猜测是,执行许多单个插入语句的开销是差异的最大部分。有没有办法指示 EF4 组合插入语句以减少开销?
-
@Lasse:是的,有。 EF 实现了开箱即用的工作单元模式 - 请参阅我的答案。
-
我已经使用 Visual Studio 进行了一些分析。并且 cookRecipes.Recipes.Add(recipe1) 需要大约 65% 的总时间来存储,而 SaveChanges 大约需要 35% (duh ... ;))。
-
不确定它有多重要,但您使用的是什么 CTP 版本的纯代码?
-
CTP 4 从这里下载:microsoft.com/downloads/…
标签: c# entity-framework db4o