私は現在、自分の 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 を高速化できるとさえ思いますか? データベース ファイルを初期化しないので、動的に拡張するだけです。