12

我目前正在对我的 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 (ms)

我使用 EF4 将这些东西存储在 SQL Server 2008(Express,本地)中,如下所示:

cookRecipes.Recipes.Add(recipe1);
cookRecipes.SaveChanges();

这需要 200.000 (ms)

现在db4o 15(!!!) 到底是如何比EF4/SQL 快的?我是否缺少 EF4 的秘密加速按钮?我什至认为 db4o 可以做得更快?由于我没有初始化数据库文件,我只是让它动态增长。

4

4 回答 4

3

你在循环SaveChanges() 内调用了吗?难怪它很慢!尝试这样做:

foreach(var recipe in The500000Recipes)
{
    cookRecipes.Recipes.Add(recipe);
}
cookRecipes.SaveChanges();

EF 希望您进行所有您想要的更改,然后调用SaveChanges 一次。这样,它可以优化数据库通信和 sql 以执行打开状态和保存状态之间的更改,忽略您已撤消的所有更改。(例如,添加 50 000 条记录,然后删除其中的一半,然后点击SaveChanges只会将 25 000 条记录添加到数据库中。永远。)

于 2010-07-27T11:47:10.083 回答
2

也许您可以在添加新对象时禁用更改跟踪,这确实会提高性能。

context.Configuration.AutoDetectChangesEnabled = false;

另请参阅以获取更多信息:http ://coding.abel.nu/2012/03/ef-code-first-change-tracking/

于 2013-02-12T15:17:07.000 回答
1

只是添加到其他答案:db4o 通常在进程内运行,而 EF 抽象出进程外 (SQL) 数据库。但是,db4o 本质上是单线程的。因此,虽然对于这个带有一个请求的示例可能会更快,但 SQL 将比默认的 db4o 数据库设置更好地处理并发(多个查询、多个用户)。

于 2010-08-24T15:38:31.323 回答
1

EF 擅长很多事情,但批量加载不是其中之一。如果你想要高性能的批量加载,直接通过 DB 服务器来做会比任何ORM 都快。如果您的应用的唯一性能限制是批量加载,那么您可能不应该使用 EF。

于 2010-07-27T13:23:40.660 回答