db4o 是一个原生于java和.net的面向对象数据库。它相当的轻量,只需要在项目里添加一个 Db4objects.Db4o.dll 就能使用db4o。看起来是很好玩的一个东西。
先测试一下这个oodb的速度是如何的,需要添加Db4objects.Db4o.dll 和 Db4objects.Db4o.Linq.dll 引用:
测试代码
#region 性能测试代码
class TestClass
{
public Guid ID;
public int IntField;
public TestClass(int IntField)
{
ID = Guid.NewGuid();
this.IntField = IntField;
}
}
// 存储50W个对象
static void PerformanceTest_Create()
{
int Times = 500000;
using (IObjectContainer db = Db4oFactory.OpenFile("TestDBFile"))
{
List<TestClass> list = new List<TestClass>();
for (int i = 0; i < Times; i++)
{
list.Add(new TestClass(i));
}
Stopwatch sw = new Stopwatch();
sw.Start();
foreach(var item in list)
{
db.Store(item);
}
sw.Stop();
db.Close();
Console.WriteLine("Create: " + sw.Elapsed.ToString());
}
}
// 在50W个对象里查询5K个对象
// 修改5K个对象
static void PerformanceTest_Modify()
{
using (IObjectContainer db = Db4oFactory.OpenFile("TestDBFile"))
{
Stopwatch sw1 = new Stopwatch();
sw1.Start();
var result = from TestClass p in db
where p.IntField >= 10000 && p.IntField < 15000
select p;
sw1.Stop();
Console.WriteLine("Select: " + sw1.Elapsed.ToString());
List<TestClass> ModifyList = result.ToList();
foreach (var item in ModifyList)
{
item.IntField -= item.IntField * 2;
}
Stopwatch sw2 = new Stopwatch();
sw2.Start();
foreach (var item in ModifyList)
{
db.Store(item);
}
sw2.Stop();
db.Close();
Console.WriteLine("Modify: " + sw2.Elapsed.ToString());
}
}
// 删除50W个对象
static void PerformanceTest_Delete()
{
using (IObjectContainer db = Db4oFactory.OpenFile("TestDBFile"))
{
var result = from TestClass p in db
select p;
Stopwatch sw = new Stopwatch();
sw.Start();
foreach (var item in result)
{
db.Delete(item);
}
sw.Stop();
db.Close();
Console.WriteLine("Delete: " + sw.Elapsed.ToString());
}
}
#endregion
// 连续执行创建,查询,修改,删除。
static void Main(string[] args)
{
PerformanceTest_Create();
PerformanceTest_Modify();
PerformanceTest_Delete();
Console.ReadKey();
}
本机Cpu: AMD Athlon 3800+ ,Release版本测试结果如下:
Create: 00:01:36.0419220
Select: 00:00:00.0686757
Modify: 00:00:00.8396310
Delete: 00:01:54.6880567
期间最高占用我 320MB 内存,生成了的数据库文件71.3MB。奇怪的是Delete之后数据库文件还是有59.4MB。
然后执行下面代码:
using (IObjectContainer db = Db4oFactory.OpenFile("TestDBFile"))
{
var result = db.Query<object>();
Console.WriteLine(result.Count());
}
里面居然有999个对象,通过debug查看这些对象,发现里面就只是一个Guid,很神秘不知道作用是什么。