1. 测试删除记录操作效率1.1 测试单条记录删除效率

Stopwatch mainStopWatch = new Stopwatch(); mainStopWatch.Start(); using (var dbContext = new SQLiteDbContext()) { var data = dbContext.Set<Bus>().FirstOrDefault(i => true); if (data != null) dbContext.Set<Bus>().Remove(data); dbContext.SaveChanges(); } mainStopWatch.Stop(); Console.WriteLine("TestAddAndDeleteHistory - query 1 record and Remove cost " mainStopWatch.ElapsedMilliseconds "ms");

1.2 测试10条记录删除效率

mainStopWatch.Restart(); //原始模式测试删除10条历史记录的效率 using (var dbContext = new SQLiteDbContext()) { var datas = dbContext.Set<Bus>().Where(i=>true).Take(10); dbContext.Set<Bus>().RemoveRange(datas); dbContext.SaveChanges(); } mainStopWatch.Stop(); Console.WriteLine("TestAddAndDeleteHistory - query 10 records and RemoveRange cost " mainStopWatch.ElapsedMilliseconds "ms");

1.3 测试添加一条记录效率

//原始模式测试添加1条历史记录的效率 using (var dbContext = new SQLiteDbContext()) { var data = dbContext.Set<Bus>().Add(new Bus() {Id = Guid.NewGuid().ToString(), Name = "11 路", CreateTime = DateTime.Now}); dbContext.SaveChanges(); } mainStopWatch.Stop(); Console.WriteLine("TestAddAndDeleteHistory - Add 1 records cost " mainStopWatch.ElapsedMilliseconds "ms");

1.4 测试结果

ef模型创建与实现(EF插入记录和删除历史记录多线程安全测试)(1)

2. 测试多次删除执行效率2.1 测试一:测试单一DbContext删除100次(每次10条记录)效率2.1.1 测试代码

mainStopWatch.Restart(); //同一个DbContext执行100次删除操作(每次10条记录)花费时间 using (SQLiteDbContext db = new SQLiteDbContext()) { for (int i = 0; i < 100; i ) { //lock (lock_ojb) { var datas = db.Set<Bus>().Where(record => true).Take(10); db.Set<Bus>().RemoveRange(datas); db.SaveChanges(); } } } mainStopWatch.Stop(); Console.WriteLine("TestAddAndDeleteHistory - Single DbContext RemoveRange 100 times (10 records per time) cost " mainStopWatch.ElapsedMilliseconds "ms");

2.2 测试二:测试删除100次(每次10条记录),每次删除一个DbContext效率2.2.1 测试代码

mainStopWatch.Restart(); //执行100次删除操作(每次10条记录)每次一个DbContext花费时间 for (int i = 0; i < 100; i ) { using (SQLiteDbContext db = new SQLiteDbContext()) { //lock (lock_ojb) { var datas = db.Set<Bus>().Where(record => true).Take(10); db.Set<Bus>().RemoveRange(datas); db.SaveChanges(); } } } mainStopWatch.Stop(); Console.WriteLine("TestAddAndDeleteHistory - RemoveRange 100 times (10 records per time)," "one DbContext every time cost " mainStopWatch.ElapsedMilliseconds "ms");

2.3 测试结论

ef模型创建与实现(EF插入记录和删除历史记录多线程安全测试)(2)

3. 测试单一context多线程添加和删除3.1 测试代码

//单一context添加删除多线程测试 SQLiteDbContext db = new SQLiteDbContext(); var task1 = Task.Factory.StartNew(() => { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); //using (SQLiteDbContext db = new SQLiteDbContext()) { for (int i = 0; i < 1000; i ) { db.Set<Bus>().Add(new Bus() {Id = Guid.NewGuid().ToString(), Name = "11 路", CreateTime = DateTime.Now}); db.SaveChanges(); } } stopwatch.Stop(); Console.WriteLine("Single Context Task1 write 1000 records cost = " stopwatch.ElapsedMilliseconds "ms"); }); var task2 = Task.Factory.StartNew(() => { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); //using (SQLiteDbContext db = new SQLiteDbContext()) { for (int i = 0; i < 100; i ) { //lock (lock_ojb) { var datas = db.Set<Bus>().Where(record => true).Take(10); db.Set<Bus>().RemoveRange(datas); db.SaveChanges(); } Thread.Sleep(50); } } stopwatch.Stop(); Console.WriteLine("Single Context Task2 write 50 records cost = " stopwatch.ElapsedMilliseconds "ms"); }); Task.WaitAll(task1, task2); db.Dispose();

3.2 测试结果:多线程异常

ef模型创建与实现(EF插入记录和删除历史记录多线程安全测试)(3)

4. 测试每个线程一个DbContex的多线程添加和删除记录4.1 测试代码

var task1 = Task.Factory.StartNew(() => { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); using (SQLiteDbContext db = new SQLiteDbContext()) { for (int i = 0; i < 1000; i ) { db.Set<Bus>().Add(new Bus() {Id = Guid.NewGuid().ToString(), Name = "11 路", CreateTime = DateTime.Now}); db.SaveChanges(); } } stopwatch.Stop(); Console.WriteLine("Using Context Task1 write 1000 records cost = " stopwatch.ElapsedMilliseconds "ms"); }); var task2 = Task.Factory.StartNew(() => { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); using (SQLiteDbContext db = new SQLiteDbContext()) { for (int i = 0; i < 100; i ) { //lock (lock_ojb) { var datas = db.Set<Bus>().Where(record => true).Take(10); db.Set<Bus>().RemoveRange(datas); db.SaveChanges(); } } } stopwatch.Stop(); Console.WriteLine("Using Context Task2 Remove 100 * 10 records cost = " stopwatch.ElapsedMilliseconds "ms"); }); Task.WaitAll(task1, task2);

4.2 测试结果

ef模型创建与实现(EF插入记录和删除历史记录多线程安全测试)(4)

5. 测试多线程添加和删除,每次操作都Using一个DbContext5.1 测试代码

var task1 = Task.Factory.StartNew(() => { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); for (int i = 0; i < 1000; i ) { using (SQLiteDbContext db = new SQLiteDbContext()) { db.Set<Bus>().Add(new Bus() {Id = Guid.NewGuid().ToString(), Name = "11 路", CreateTime = DateTime.Now}); db.SaveChanges(); } } stopwatch.Stop(); Console.WriteLine("Using Context Task1 write 1000 records cost = " stopwatch.ElapsedMilliseconds "ms"); }); var task2 = Task.Factory.StartNew(() => { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); for (int i = 0; i < 100; i ) { using (SQLiteDbContext db = new SQLiteDbContext()) { //lock (lock_ojb) { var datas = db.Set<Bus>().Where(record => true).Take(10); db.Set<Bus>().RemoveRange(datas); db.SaveChanges(); } } } stopwatch.Stop(); Console.WriteLine("Using Context Task2 Remove 100 * 10 records cost = " stopwatch.ElapsedMilliseconds "ms"); }); Task.WaitAll(task1, task2);

5.2 测试结论

ef模型创建与实现(EF插入记录和删除历史记录多线程安全测试)(5)

,