`
h_rain
  • 浏览: 121549 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
文章分类
社区版块
存档分类
最新评论

对Berkeley DB的性能进行的部分测试

阅读更多

 

零 环境说明:
    所有的数据插入的都是Key=int,Value=int,在循环中递增的.
    本机NTFS的默认簇大小为4K.
    本机配置仅仅影响绝对值.相对值是可比较的:
        OS=WinXP SP2;RAM=1G;CPU=AMD Athlon 64 X2 Dual 5000+;Disk=160G  
    测试的实际数据量为:300*10000*2*sizeof(int)/1024/1024~=22.89MByte
    下面所有的测试结果的单位都是秒.
    编译器: C++ builder 6.0(使用bcb编译BDB源码,形成LIB库后,直接链接到测试程序中.没有测试DLL的形式.)
    BDB版本:4.6.21.NC

 

 一 测试页尺寸对读写性能的影响:
    记录数量 =300万 缓存尺寸=0M
读写\页尺寸 1K 2K 4K 8K 16K 32K
B+写 94.94 84.83 82.73 97.16 142.67 232.11
HASH写 346.16 320.41 288.36 295.19 599.66 867.03
B+读 4.22 4.06 3.86 3.91 3.80 3.78
HASH读 8.25 7.94 5.42 5.41 4.99 4.88

结论:页尺寸与文件系统的簇大小相同时,写入性能最佳,读取性能中等.

在0M缓存的时候,B+的性能要比HASH好得多.

 

 

 二 测试cache缓存大小对读写性能的影响:
    记录数量=300万  页尺寸=4K   真实数据量=22.89MByte 数据库文件大小=80M
读写\缓存 0M 10M 20M 40M 80M 160M 320M
B+写 85.06 88.66   133.31   164.81   15.31   15.34   15.27
HASH写 292.91 224.47   180.76   95.28   20.11 20.06 20.05
B+读 3.98 4.17   4.86   9.56   3.83   3.81   3.80  
HASH读 5.53 5.83   5.83 8.16 5.20 5.08 5.16

 

    记录数量=600万  页尺寸=4K   真实数据量=45.78MByte 数据库文件大小=160M
读写\缓存 0M 40M 80M 160M 320M
B+写 259.39   1198.27   1017.94   34.59   34.30  
HASH写 1889.32   1279.95 563.12   40.67 40.89
B+读 7.89   14.02 22.84   7.97   8.03  
HASH读 11.17   16.81 11.66 10.39 10.88

 

结论:
    对于缓存大于数据库文件尺寸的时候,没有太多可说的,操作都在内存中,速度非常快.   
    对于大数据量的读取,两组对比都比较清晰的说明了一点:缓存的大小对读取记录的性能影响不是很大.
    对于大数据量的写入,缓存对性能的影响就非常可观了,基本可以肯定的是,HASH库缓存越大写入速度越快.   而奇怪的是,B+库在缓存不足的时候,性能反而比0缓存时还要差很多!!
    总的来说,在我的这些测试中,B+与HASH数据库的性能差异很大.
    对于缓存大于物理内存的情况未做测试,估计对性能不会有好的影响,毕竟在这种情况下,效率的瓶颈都是在磁盘的IO上.
测试的核心代码如下:
 
#include <db_cxx.h>
#define	DATABASE	"access.db"
//tcount=记录数为多少万次,DbType=数据库类型,psize=页尺寸K,csize=缓存尺寸M
void run(int tcount,DBTYPE DbType,size_t psize,size_t csize)
{
	remove(DATABASE);
	Db db(0, 0);

	db.set_errpfx("AccessExample");
	db.set_pagesize(1024*psize);
	db.set_cachesize(0, 1024*1024*csize, 0);
	db.open(NULL, DATABASE, NULL, DbType, DB_CREATE|DB_THREAD, 0664);

    int testcount=10000*tcount;
    size_t tick1=GetTickCount();
	for (int i=0;i<testcount;i++)
    {
		Dbt key(&i,sizeof(int));
		Dbt data(&i,sizeof(int));
		db.put(0, &key, &data, DB_NOOVERWRITE);
    }
    
    printf("插入结束 %d 万记录,全部用时:%.2f秒\r\n",tcount,(GetTickCount()-tick1)/(float)1000);
    tick1=GetTickCount();
	try
    {
		Dbc *dbcp;
		db.cursor(NULL, &dbcp, 0);
		Dbt key;
		Dbt data;
		while (dbcp->get(&key, &data, DB_NEXT) == 0)
        {
			key.get_data();
			data.get_data();
		}
		dbcp->close();
        printf("遍历结束 %d 万记录,全部用时:%.2f秒\r\n",tcount,(GetTickCount()-tick1)/(float)1000);
        db.sync(0);
	}
	catch (DbException &dbe) {}
	db.close(0);
}
  
分享到:
评论
4 楼 h_rain 2009-02-22  
结论:页尺寸与文件系统的簇大小相同时,写入性能最佳,读取性能中等.

缓存用尽后,性能的瓶颈就在于磁盘IO.
BDB内部对IO进行了优化,每次操作都是对"页尺寸"字节进行处理,就是说,读写10字节或100字节的时候,其实都是在"页尺寸"这么大的内存上进行读写,之后一次性将一个页写入磁盘.你给定的页尺寸是8k,但ntfs默认的"簇"大小是4k,所以这样的操作要跨簇进行,效率就低了.

建议根据文件系统的"簇"大小设置BDB的"页尺寸".
这样的话,耗时基本是定长的了.
3 楼 peter_wu 2009-02-20  
观察任务管理器,发现速度快的时候,cache还没有用完,没有IO操作。当内存不再增长,cache用完的时候,IO开始大量读取和写入,速度开始下降。原来如此啊。
2 楼 peter_wu 2009-02-20  
插入一个周期,10w 用时 0.00 秒
插入一个周期,10w 用时 0.92 秒
插入一个周期,10w 用时 1.09 秒
插入一个周期,10w 用时 1.11 秒
插入一个周期,10w 用时 1.14 秒
插入一个周期,10w 用时 1.16 秒
插入一个周期,10w 用时 1.19 秒
插入一个周期,10w 用时 1.14 秒
插入一个周期,10w 用时 1.19 秒
插入一个周期,10w 用时 1.20 秒
插入一个周期,10w 用时 1.20 秒
插入一个周期,10w 用时 1.28 秒
插入一个周期,10w 用时 1.22 秒
插入一个周期,10w 用时 1.17 秒
插入一个周期,10w 用时 1.20 秒
插入一个周期,10w 用时 1.19 秒
插入一个周期,10w 用时 1.20 秒
插入一个周期,10w 用时 1.26 秒
插入一个周期,10w 用时 1.24 秒
插入一个周期,10w 用时 1.16 秒
插入一个周期,10w 用时 1.17 秒
插入一个周期,10w 用时 1.38 秒
插入一个周期,10w 用时 1.19 秒
插入一个周期,10w 用时 1.20 秒
插入一个周期,10w 用时 1.16 秒
插入一个周期,10w 用时 1.19 秒
插入一个周期,10w 用时 1.17 秒
插入一个周期,10w 用时 1.22 秒
插入一个周期,10w 用时 1.17 秒
插入一个周期,10w 用时 1.20 秒
插入一个周期,10w 用时 1.22 秒
插入一个周期,10w 用时 1.28 秒
插入一个周期,10w 用时 1.19 秒
插入一个周期,10w 用时 1.33 秒
插入一个周期,10w 用时 1.19 秒
插入一个周期,10w 用时 1.23 秒
插入一个周期,10w 用时 1.22 秒
插入一个周期,10w 用时 1.20 秒
插入一个周期,10w 用时 1.22 秒
插入一个周期,10w 用时 1.23 秒
插入一个周期,10w 用时 1.42 秒
插入一个周期,10w 用时 1.22 秒
插入一个周期,10w 用时 1.19 秒
插入一个周期,10w 用时 1.27 秒
插入一个周期,10w 用时 5.84 秒
插入一个周期,10w 用时 9.52 秒
插入一个周期,10w 用时 14.03 秒
插入一个周期,10w 用时 15.39 秒
插入一个周期,10w 用时 16.44 秒
插入一个周期,10w 用时 20.39 秒
插入结束 500 万记录,全部用时:156.05秒
遍历结束 500 万记录,全部用时:14.11秒
请按任意键继续. . .
1 楼 peter_wu 2009-02-20  
我改了下代码,发现一个问题,随着时间推移,插入效率下降严重,请问是为什么。

#include <db_cxx.h>  
#include <Windows.h>
#define DATABASE    "access.db"  
void run(int tcount,DBTYPE DbType,size_t psize,size_t csize)  ;
void main(int argc,char * argv[])
{
	run(500,DB_BTREE,8,100);
}


//tcount=记录数为多少万次,DbType=数据库类型,psize=页尺寸K,csize=缓存尺寸M  
void run(int tcount,DBTYPE DbType,size_t psize,size_t csize)  
{  
	remove(DATABASE);  
	Db db(0, 0);  

	db.set_errpfx("AccessExample");  
	db.set_pagesize(1024*psize);  
	db.set_cachesize(0, 1024*1024*csize, 0);  
	db.open(NULL, DATABASE, NULL, DbType, DB_CREATE|DB_THREAD, 0664);  

	int testcount=10000*tcount;  
	size_t tick1=GetTickCount();  

	DWORD inlinetick=tick1;
	for (int i=0;i<testcount;i++)  
	{  
		Dbt key(&i,sizeof(int));  
		Dbt data(&i,sizeof(int));  
		db.put(0, &key, &data, DB_NOOVERWRITE);  
		if (i%100000==0)
		{
			printf("插入一个周期,10w 用时 %.2f 秒\n",(GetTickCount()-inlinetick)/(float)1000);
			inlinetick=GetTickCount();
		}
	}  

	printf("插入结束 %d 万记录,全部用时:%.2f秒\r\n",tcount,(GetTickCount()-tick1)/(float)1000);  
	tick1=GetTickCount();  
	try  
	{  
		Dbc *dbcp;  
		db.cursor(NULL, &dbcp, 0);  
		Dbt key;  
		Dbt data;  
		while (dbcp->get(&key, &data, DB_NEXT) == 0)  
		{  
			key.get_data();  
			data.get_data();  
		}  
		dbcp->close();  
		printf("遍历结束 %d 万记录,全部用时:%.2f秒\r\n",tcount,(GetTickCount()-tick1)/(float)1000);  
		db.sync(0);  
	}  
	catch (DbException &dbe) {}  
	db.close(0);  
}  

相关推荐

    BerkeleyDB测试程序

    总结来说,"BerkeleyDB测试程序"是对BerkeleyDB性能的全面评估,涵盖了数据入库和读取速度两个关键方面。通过对这些操作的深入理解和优化,我们可以更好地利用BerkeleyDB的优势,提升应用的性能。在实际应用中,还...

    Berkeley并发性能测试

    总结,Berkeley DB的并发性能测试是对其在多线程环境下的功能和性能进行全面评估的过程,涉及到锁管理、事务处理、性能指标、日志恢复、资源消耗及稳定性等多个方面。通过深入测试,我们可以优化数据库设置,提高...

    Berkeley DB4.8以上各版本

    Berkeley DB是一款由Oracle公司开发的嵌入式数据库系统,被广泛应用于许多软件项目中,尤其是在需要快速、轻量级数据存储解决方案的场景下。...在升级或选择数据库版本时,可以参考这些文件进行兼容性和性能测试。

    Berkeley DB参考资料

    ### Berkeley DB 参考资料知识点概览 #### 1. Berkeley DB —— Cursor - **1.1 Introduction** - **定义与作用**:在Berkeley DB中,游标(Cursor)是用于... - **测评目的**:对 Berkeley DB 进行全面的性能和功能...

    Berkeley DB参考手册PDF版本

    - **25.1 测评报告**:提供Berkeley DB的性能测试结果及使用心得。 - **性能评估**:对Berkeley DB的各项性能指标进行评估。 - **使用心得**:分享使用者对于Berkeley DB的实际使用体验和建议。

    Berkeley DB

    1. **键值对存储**:Berkeley DB基于键值对模型,允许用户通过唯一的键来快速查找和访问相关数据。这种数据结构简单而高效,适合处理大量的非结构化和半结构化数据。 2. **事务支持**:提供了ACID(原子性、一致性...

    berkeley db installation

    Berkeley DB支持多种数据模型,包括键值对存储、关系型数据库以及B树等结构,这使得它能够在不同的场景下提供卓越的性能。 **安装概述与平台支持** Berkeley DB的安装过程涵盖了多个方面,包括但不限于基础环境的...

    db.rar_Berkeley DB_嵌入式 数据库

    在"db.rar"这个压缩包中,包含了几个关键文件,它们揭示了如何在嵌入式系统at91rm9200上使用Berkeley DB 4.5.20进行数据库操作: 1. **mdb.c**:这可能是一个示例程序,展示了如何使用Berkeley DB的内存数据库...

    berkeley-db- performace test specification white paper .pdf

    ### Berkeley DB性能测试规范白皮书关键知识点解析 #### 概述 《Berkeley DB:性能指标与基准测试》是一份由Oracle发布的白皮书,该文档主要关注于Oracle Berkeley DB在不同操作系统、硬件平台及配置下的性能表现...

    xdb.rar_BerkeleyDB_C++动态库封装_vc xdb_xdb.rar

    BerkeleyDB,简称BDB,是一款开源的、高性能、轻量级的嵌入式数据库系统,广泛应用于各种分布式应用环境中,尤其在对数据存储和访问速度有高要求的场景下表现出色。在本项目中,开发者对BerkeleyDB进行了C++动态库的...

    Berkeley 数据库

    4. **操作系统组件**:部分操作系统内核组件,如文件系统的元数据,也可能采用 Berkeley DB 来提高性能。 5. **安全系统**:身份验证、访问控制列表等安全相关数据的存储也常用到 Berkeley DB。 **三、安装与使用*...

    基于Berkeley DB的嵌入式流媒体存储系统的设计方案

    电子技术是构建任何嵌入式系统的基础,而开发板则是进行系统原型设计和测试的重要工具。 综上所述,该设计方案不仅覆盖了数据库、流媒体、文件系统和操作系统等多个技术领域,还涉及到了数据安全、检索效率和实时...

    Berkeley DB JE tools-开源

    Berkeley DB JE(Java Edition)是Oracle公司提供的一款开源、高性能、嵌入式数据库系统,主要针对Java应用程序设计。它提供了键值对存储,支持事务处理、数据复制、崩溃恢复等高级特性,常用于需要快速读写大量数据...

    OpenLDAP安装与配置(ubuntu-12.04).docx

    BerkeleyDB是一个高性能的数据库,OpenLDAP需要它来存储数据。在安装OpenLDAP之前,需要先安装BerkeleyDB。 二、安装BerkeleyDB 安装BerkeleyDB需要下载BerkeleyDB的安装包,并解压缩它。然后,需要配置和安装...

    封装好的berbeley db 多线程API 源码(c++)

    - 类成员变量可能包含Berkeley DB的环境(DB_ENV)和数据库(DB)对象,这些对象的创建和关闭也是API的一部分。 5. **数据一致性与事务管理**: - **事务**:Berkeley DB支持事务,可以在API中使用事务来确保一组...

    cmpp测试工具 cmpp测试工具 cmpp测试工具

    通过这些组件,开发者可以使用CMPP测试工具进行系统集成测试、性能测试以及故障排查,确保其SP系统满足中国移动的通信规范,提高服务质量。在实际使用过程中,根据测试报告调整优化系统,以达到最佳的短信发送和接收...

    Ldan数据库BDB

    Oracle Berkeley DB提供了一个键值对存储模型,适用于需要快速、可靠的数据存储的应用程序,如LDAP服务器。它被广泛用于存储和管理LDAP目录服务的基础数据,因为其性能优异且易于集成。 **LDAP与Berkeley DB的结合*...

    db-4.3.27.tar.gz

    Berkeley DB是由Oracle公司开发的一个轻量级、高性能、嵌入式数据库系统,广泛应用于各种软件项目,包括操作系统内核、网络服务器和应用程序等。 在Linux环境下,`.tar.gz`是一种常见的文件打包和压缩格式。`.tar`...

    Berkeley Database Midterm Exam with solution

    - **A点**:这是应用程序首次遭受性能下降的地方,原因是当数据无法在BerkeleyDB缓存中找到时发生的。 - **B点**:进一步的性能下降发生在当数据也无法在操作系统缓存中找到时。 - **优化建议**: - **缓存优化**...

    BerkeleyDBTest_UI所需mfc120d.dll

    在UI测试中,可能涉及到对数据库读写性能的验证,或者对用户交互时数据库操作的响应时间的评估,因此,MFC库与Berkeley DB的协同工作对于测试结果的准确性至关重要。 然而,值得注意的是,"mfc120d.dll"是调试版本...

Global site tag (gtag.js) - Google Analytics