⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tdbspeed.c

📁 Linux下的一个关系数据库源代码
💻 C
字号:
#include <stdlib.h>#include <stdio.h>#include <fcntl.h>#include <unistd.h>#include <string.h>#include <fcntl.h>#include <sys/mman.h>#include <sys/stat.h>#include <sys/time.h>#include "tdb.h"#include <gdbm.h>/* Turn off if error returns from TDB are sane (before v1.0.2) */#if 1#define TDB_ERROR(tdb, code) ((tdb)->ecode == code)#else#define TDB_ERROR(tdb, code) 1#endif/* a test program for tdb - the trivial database */static TDB_DATA *randdata, *randkeys;#define DELETE_PROB 7#define STORE_PROB 5static TDB_CONTEXT *db;static GDBM_FILE gdbm;struct timeval tp1,tp2;static void start_timer(){	gettimeofday(&tp1,NULL);}static double end_timer(){	gettimeofday(&tp2,NULL);	return((tp2.tv_sec - tp1.tv_sec) + 	       (tp2.tv_usec - tp1.tv_usec)*1.0e-6);}static void fatal(TDB_CONTEXT *tdb, const char *why){	perror(why);	if (tdb) fprintf(stderr, "TDB: (%u)\n", tdb->ecode);	exit(1);}static char *randbuf(int len){	char *buf;	int i;	buf = (char *)malloc(len+1);	for (i=0;i<len;i++) {		buf[i] = 'a' + (rand() % 26);	}	buf[i] = 0;	return buf;}static void addrec_db(int i){	TDB_DATA key, data;	key.dptr = randkeys[i].dptr;	key.dsize = randkeys[i].dsize+1;	data.dptr = randdata[i].dptr;	data.dsize = randdata[i].dsize+1;	if (rand() % DELETE_PROB == 0) {		if (tdb_delete(db, key) == -1		    && !TDB_ERROR(db, TDB_ERR_NOEXIST))			fatal(db, "tdb_delete failed");	} else if (rand() % STORE_PROB == 0) {		if (tdb_store(db, key, data, TDB_REPLACE) != 0) {			fatal(db, "tdb_store failed");		}	} else {		data = tdb_fetch(db, key);		if (data.dptr) free(data.dptr);		else {			if (db->ecode && !TDB_ERROR(db,TDB_ERR_NOEXIST))				fatal(db, "tdb_fetch failed");		}	}}struct db_size {	const char *name;	int size;} db_sizes[]= { { "default", 0 },    { "307", 307 },    { "512", 512 },    { "1024", 1024 },    { "4096", 4096 },    { "16384", 16384 },    { "65536", 65536 } };unsigned int num_loops[]  /* 10,000 each */= { 1, 5, 25 };struct tdb_flag {	const char *name;	int flags;} tdb_flags[]= { { "normal", TDB_CLEAR_IF_FIRST },#ifdef TDB_CONVERT    { "byte-reversed", TDB_CLEAR_IF_FIRST|TDB_CONVERT }#endif};int main(int argc, char *argv[]){	int i, j, seed=0;	int k;	/* Precook random buffers */	randdata = malloc(10000 * sizeof(randdata[0]));	randkeys = malloc(10000 * sizeof(randkeys[0]));	srand(seed);	for (i=0;i<10000;i++) {		randkeys[i].dsize = 1 + (rand() % 4);		randdata[i].dsize = 1 + (rand() % 100);		randkeys[i].dptr = randbuf(randkeys[i].dsize);		randdata[i].dptr = randbuf(randdata[i].dsize);	}	for (k = 0; k < sizeof(tdb_flags)/sizeof(struct tdb_flag); k++) {		printf("Operations per second for %s database:\n",		       tdb_flags[k]);		printf("Hashsize:   ");		for (i = 0; i < sizeof(db_sizes)/sizeof(struct db_size); i++)			printf("%-8s ", db_sizes[i].name);		printf("\n");				for (i = 0; i < sizeof(num_loops)/sizeof(int); i++) {			printf("%7u:    ", num_loops[i]*10000);			for (j = 0; j < sizeof(db_sizes)/sizeof(struct db_size); j++) {				unsigned int l, l2;				db = tdb_open("test.tdb", db_sizes[j].size,					      tdb_flags[k].flags,					      O_RDWR | O_CREAT | O_TRUNC, 0600);				srand(seed);				start_timer();				for (l2=0; l2 < num_loops[i]; l2++)					for (l=0;l<10000;l++) addrec_db(l);				printf("%-7u  ", (int)(l*l2/end_timer()));				tdb_close(db);			}			printf("\n");		}		printf("\n");	}	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -