...私たちのテストでは、データベースへのクラス のシングル、初期化されていないインスタンスを追加することでした。 DbContext.Addを使用して...
あなたはあなたのコード・ファーストモデルはあなたがAdd
と呼ばれてきた前にメモリに作成され、ロードされていることを確認しましたか?私は、次の意味:あなたはこのようなテストコードを使用している場合...
using (var context = new MyContext())
{
var myHugeBusinessObject = CreateItSomeHow();
context.HugeBusinessObjects.Add(myHugeBusinessObject);
context.SaveChanges();
}
を...、それはあなたがあなたのテストアプリケーションAdd
にコンテキストを使用している最初の時間は、実際に構築するためのいくつかの時間を費やしますですEFモデルをメモリに格納してから、オブジェクトをコンテキストに追加します。
あなたが好きなインスタンス何かのために、単にAdd
を呼び出す前に、ダミーメソッドを追加することによって、これらの2つのステップを分離することができます。これにより
public class MyClass
{
public int Id { get; set; }
public string P1 { get; set; }
// ... P2 to P49
public string P50 { get; set; }
public MyClass Child1 { get; set; }
// ... Child1 to Child26
public MyClass Child27 { get; set; }
}
私が作成した:
context.HugeBusinessObjects.Count();
私がテストを構築しましたオブジェクト:
var my = new MyClass();
MyClass child = my;
for (int i = 0; i < 100; i++)
{
child.Child1 = new MyClass();
child = child.Child1;
}
child = my;
for (int i = 0; i < 100; i++)
{
child.Child2 = new MyClass();
child = child.Child2;
}
// and so on up to Child27
このオブジェクトグラフには2700個の子オブジェクトがありますそれぞれ50スカラーのプロパティ。それから私はこのコードをテストした:
using (var context = new MyContext())
{
var my = CreateWithTheCodeAbove();
context.MyClassSet.Count();
context.MyClassSet.Add(my);
context.SaveChanges();
}
...Count()
(= EFモデルを構築する)おおよそ25秒を必要とします。 Add
が必要です1秒です。 (上記のループで100から1000を変更すると(グラフの中に27000個のオブジェクトがある場合)Add
の時間はほぼ直線的に9-10秒に増加します)。この結果は、AutoDetectChangesEnabled
からtrue
またはfalse
には依存しません。)
次の興味深い結果:私はMyClass
にサンプルコードでモデル(Count()
の構築と一緒に過ごした時間)140秒に爆発をより20のナビゲーションプロパティ(Child47
からChild28
)を追加した場合。 Add
の継続時間は、追加のプロパティとともに直線的に増加するだけです。
私の仮説は次のとおりです。コンテキストにビジネスオブジェクトを追加する時間は実際には測定されませんが、EFモデルをメモリに組み込む必要がある時間です。モデルを構築する時間は、モデルの複雑さに伴って指数関数的に増加するように見えます。クラスのナビゲーションプロパティの数とおそらく異なる関与クラスの数。
これらのステップを分離するには、上記のようなダミーコールを使用します。あなたはすでにこの分離を持っているなら... omg、この投稿を忘れてください。
SQLプロファイラで生成したSQLを見ましたか?時々、EFがSQLを調べることによって何をしようとしているかについて、多くのことを集めることができます。私の意見では、関連する60のクラスをdbに保存するのは、EFの1秒未満の操作でなければなりません。 – automagic
私たちはそれを試していませんでした。なぜなら、最後にデータベースを叩くだけで、すべての処理がEF内で行われていたからです。トレースは非常に大きいです...私は私が何を探していなければならないのかよく分かりません。 – dythim
コンテキストを作成して再度測定するときに 'dbContext.Configuration.AutoDetectChangesEnabled = false; 'を設定してみてください。 'Add'は遅いと言うので(' SaveChanges'ではなく)、私は自動変更の検出/スナップショットの作成が遅くなると思っています。 – Slauma