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");
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条历史记录的效率
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");
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");
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");
- 测试二比测试一效率略高
- 跟单次删除相比,多次删除效率高于单次删除
//单一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();
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);
- 未出现异常,说明每个线程(上下文)一个DbContext是线程安全的
- 添加一条记录时间330ms左右,跟单独Add相差不大
- 删除一次执行时间1231ms,时间较长,可能收到多线程的影响
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);
- 未出现异常
- 添加一条记录时间338ms左右,跟单独Add相差不大
- 删除一次执行时间813ms,时间较长,但比每个线程一个DbContext时间短可能收到多线程的影响