Berkeley DBの性能に対する部分テスト

4189 ワード


ゼロ環境の説明:
すべてのデータが挿入するのはKey=int,Value=intであり,ループの中で増加する.
ネイティブNTFSのデフォルトクラスタサイズは4 Kである.
本機の構成は絶対値にのみ影響する.相対値は比較可能です.
        OS=WinXP SP2;RAM=1G;CPU=AMD Athlon 64 X2 Dual 5000+;Disk=160G  
テストの実際のデータ量は、300*10000*2*sizeof(int)/1024/1024~=2.89 MByte
次のすべてのテスト結果の単位は秒です.
コンパイラ:C++builder 6.0(bcbを使用してBBBソースコードをコンパイルし、LIBライブラリを形成した後、直接テストプログラムにリンクする.DLLの形式をテストしない.)
BDバージョン:4.6.21.NC
 
ページサイズが読み書き性能に与える影響をテストします.
レコード数=300万キャッシュサイズ=0 M
リード/ライト/ページサイズ
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
結論:ページサイズはファイルシステムのクラスタサイズと同時に、書き込み性能が最も良く、読み取り性能が中等である.
0 Mキャッシュの時、B+の性能はHASHよりずっと良いです.
 
 
二cacheキャッシュサイズが読み書き性能に与える影響をテストする.
レコード数=300万ページサイズ=4 K実データ量=2.89 MByteデータベースファイルサイズ=80 M
リード/ライト/キャッシュ
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万ページサイズ=4 K実データ量=45.78 MByteデータベースファイルサイズ=160 M
リード/ライト/キャッシュ
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
",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
",tcount,(GetTickCount()-tick1)/(float)1000); db.sync(0); } catch (DbException &dbe) {} db.close(0); }