3

Entity FrameworkでBindingSourceを使用していて、

EntityContext.SaveChange();

次にバインディングソースに新しいオブジェクトを追加してからSaveChanges()を呼び出すよりも、実行に時間がかかります。方法

編集2

詳細:

ロードフォームイベント時

BindingSource.DataSource = EntityContext.Table;

[新しい追加]ボタン

BindingSource.AddNew();
Table m_object= (Table)BindingSource.Current;
m_object.ID = Guid.NewGuid();

他のオブジェクトデータは、そのプロパティにバインドされたコントロールを使用して編集されています

そして保存ボタン

BindingSource.EndEdit();
Stopwatch sw = new Stopwatch();
sw.Start();
EntityContext.SaveChanges();
sw.Stop();
Console.WriteLine(sw.Elapsed.ToString());

追加と保存を数回繰り返すと、次の出力が得られます。

00:00:01.0788243

00:00:00.0316786

00:00:00.0292763

00:00:00.0298630

00:00:00.1127312

最初の追加と保存の操作は、次に追加して保存するときよりもほぼ1秒長くかかることに注意してください。

4

3 に答える 3

1

これにはさまざまな理由が考えられます。考えられる理由の 1 つは、最初のコミットを実行したときにデータベースが AutoGrowing になっていることです。実行しているコードの例と、観察している時間の違いはありますか

編集:

上記のコードに基づいて、データベースにアイテムが存在しない場合に新しいアイテムを作成しています。2回目に保存をクリックすると、SQL内でより高速な更新操作を実行しているだけでしょうか? (または、EF が変更がないことを検出した場合、0 時間になる可能性があります)

于 2012-04-18T00:17:51.407 に答える
0

Luke が提供した理由はありますが、JIT (ジャストインタイム) コンパイルについても忘れないでください。C# アプリケーションを実行すると、すべてが MSIL (Microsoft Intermediate Language) にコンパイルされます。メソッドの呼び出しを初めて開始すると、JIT はメソッドをネイティブ コードにコンパイルし、実行中の OS に合わせて最適化を実行する必要があります。これは、大規模な操作を初めて実行するときに、予想されるミリ秒ではなく数秒の遅延が発生する一般的な理由です。

Mono には AOT (ahead-of-time) コンパイル機能があります。つまり、最初にメソッドを呼び出したときにステップをスキップして余分な時間を回避しますが、他の場所ではパフォーマンスが犠牲になります。

Windows で C# をネイティブにプリコンパイルできるツールもありますが、それが何と呼ばれていたかは覚えていません。

http://en.wikipedia.org/wiki/Just-in-time_compilation

于 2012-04-18T00:48:45.257 に答える
0

また、最初の操作の後にデータをキャッシュしている可能性のある EF Change Tracker についても忘れないでください。MergeOption と実行中の操作に基づいて、EF はデータベースを呼び出さないことさえ選択する場合があります。データベースへの実際の呼び出しの違いを確認するために、SQL プロファイラーをオンにしてテストを実行します。また、後続の呼び出しで同じデータベース接続が使用されているかどうかを確認してください。

于 2012-04-18T17:21:37.767 に答える