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 RecipePrepations を追加します。次に、オブジェクトを次のように 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(ミリ秒)かかります

一体どうやって db4o は EF4/SQL よりも 15(!!!) 倍速いのでしょうか? 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

おそらく、新しいオブジェクトを追加するときにChangetrackingを無効にすることができます。これにより、パフォーマンスが大幅に向上します。

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 は基本的にシングルスレッドです。したがって、この 1 つの例では 1 つの要求でより高速になる可能性がありますが、SQL はデフォルトの db4o データベース設定よりもはるかに優れた並行性 (複数のクエリ、複数のユーザー) を処理します。

于 2010-08-24T15:38:31.323 に答える
1

EF は多くの点で優れていますが、一括読み込みはその 1 つではありません。高性能の一括読み込みが必要な場合は、DB サーバーを介して直接行うと、どのORM よりも高速になります。アプリの唯一のパフォーマンスの制約が一括読み込みである場合は、おそらく EF を使用しないでください。

于 2010-07-27T13:23:40.660 に答える