our project is using sqlite3, but found that the speed is too slow.
I just tested the BerkeleyDB, and found that the speed is very fast. But I
knew the sqlite3 is fast enough. And so I'm confused.
I may be using sqlite3 in wrong way?

anyway, next is my test code. I'm glad to receive your message.

______________________________________________________________________________


// http://www.ibm.com/developerworks/cn/linux/l-embdb/

//////////////////////////////    head    ///////////////////////////////
#include <stdio.h>
#include <stdlib.h> // for system
#include <string.h> // for memset strcpy
#include <time.h> // for time

#include <sqlite3.h> // for Sqlite3
#include <db.h> // for Berkeley DB



////////////////////////////  macro and struct 
/////////////////////////////
#define DB_FILE_SQLITE "test_sqlite_0.1.db"
#define DB_FILE_BDB "test_bdb_0.1.db"

struct customer
{
        int c_id;
        char name[10];
        char address[20];
        int age;
};






//////////////////////////////   global variable  
///////////////////////////////

sqlite3 *db = NULL;

int ret = -1; // 各函数返回值







//////////////////////////////   func proto  
///////////////////////////////

void way01(); // 打开、关闭的影响



///////// sqlite3 //////////

int sqlite_createtb(sqlite3 *db);
int sqlite_insertdb(sqlite3 *db);

int getdata_sqlite ( sqlite3 *db, struct customer *tb1 );



/////// berkeley db ////////

int bdb_createdb(); // 包含了插入数据

void print_error(int r);
void init_dbt( DBT *key, DBT *data );






///////////////////////////////     code    ///////////////////////////////

int main ( void )
{
        int c = 0;
        
        system ( "rm -rf test_0.1.db" );
        ret = sqlite3_open ( DB_FILE_SQLITE, &db );
        ret = sqlite_createtb(db);
        ret = sqlite_insertdb(db);
        sqlite3_close (db);
        
        printf ( "Sqlite3 / Berkeley DB, 创建数据库 + 插入数据 ... 完成\n" );
        
        printf ( "/////////////////////////////////////////////////\n" );
        printf ( "1 : 查询性能比较 - Berkeley DB 与 Sqlite3     ///\n" );
        
        while ( (c=getchar()) != 'q' )
        {
                switch (c)
                {
                case '1':
                        way01();
                        break;
                default:
                        break;
                }
        }
        
        system ( "rm -rf test_sqlite_0.1.db" );
        system ( "rm -rf test_bdb_0.1.db" );
        
        return 0;
}

///////////////////////////////////////////////////////////////
// 查询性能比较 - Berkeley DB 与 Sqlite3
void way01()
{
        time_t tick1, tick2;
        
        int i = 0;
        int num = 1000*100;
        
        struct customer tb_data;
        
        ///////////////////////////////////////////////////////////
        time ( &tick1 );
        for ( i=0; i<num; i++ )
        {
                ret = sqlite3_open ( DB_FILE_SQLITE, &db );
                ret = getdata_sqlite ( db, &tb_data );
                sqlite3_close (db);
        }
        time ( &tick2 );
        printf("Sqlite3     : 打开、关闭并操作数据库文件 %d 次, 时间为: %4ld s\n", num, tick2 -
tick1 );
        
        ///////////////////////////////////////////////////////////
        bdb_createdb();
}







///////////////////////////////////////////////////////////////
void *callback(void *para, int col, char **value, char **colname )
{
//      int i;
//      for(i=0; i<col; i++){
//              printf("%s, ", (value[i] ? value[i] : "NULL") );
//      }
//      printf("col = %d\n", col);
        return (void *) 0;
}
int getdata_sqlite ( sqlite3 *db, struct customer *tb1 )
{
        char *sql = "SELECT * FROM table1 WHERE id=500;";
        ret = sqlite3_exec ( db, sql, (void *)callback, NULL, NULL );
        return 0;
}

///////////////////////////////////////////////////////////////
int sqlite_createtb( sqlite3 *db )
{
        char *sql1 = "CREATE TABLE table1 (id INTEGER, name VARCHAR(10), address
VARCHAR(20), age INTEGER)";
        ret = sqlite3_exec ( db, sql1, NULL, NULL, NULL );
        return 0;
}
int sqlite_insertdb(sqlite3 *db)
{
        time_t tick1, tick2;
        int i = 0;
        int num = 1000;
        
        char *qf = "INSERT INTO table1 VALUES (%d, %Q, %Q, %d)";
        char *sql = NULL;
        
        time ( &tick1 );
        sqlite3_exec ( db, "BEGIN", NULL, NULL, NULL );
        for (i=0;i<num;i++)
        {
            sql = sqlite3_mprintf ( qf, i, "javer", "chengdu", 32*i );
            ret = sqlite3_exec(db, sql, NULL, NULL, NULL);
                sqlite3_free (sql);
        }
        sqlite3_exec(db,"COMMIT",NULL,NULL,NULL);
        time ( &tick2 );
        
        return 0;
}





///////////////////////////////////////////////////////////////
int bdb_createdb()
{
        time_t tick1, tick2;
        int i = 0;
        int num = 1000;
        int key_cust_c_id = 500;
        
        DB *dbp;
        DBT key, data;
        struct customer cust;


        ret = db_create(&dbp, NULL, 0);
        ret = dbp->open(dbp, NULL, DB_FILE_BDB, NULL, DB_BTREE, DB_CREATE, 
0664);

        time ( &tick1 );
        for ( i=0; i<num; i++ )
        {
                cust.c_id = i;
                strncpy(cust.name, "javer", 9);
                strncpy(cust.address, "chengdu", 19);
                cust.age = 32*i;
                
                init_dbt( &key, &data );
                
                key.size = sizeof(int);
                key.data = &(cust.c_id);
                
                data.size = sizeof(struct customer);
                data.data = &cust;
                
                ret = dbp->put(dbp, NULL, &key, &data,DB_NOOVERWRITE);
                print_error(ret);
        }
        time ( &tick2 );
        //printf ( "Berkeley DB 打开+插入+关闭, 耗时: %ld s\n", tick2-tick1 );
        
        
        printf("Berkeley DB : 插入完成\n");
        time ( &tick1 );
        for ( i=0; i<num*10000; i++ )
        {
                init_dbt( &key, &data );
                
                key.size = sizeof(int);
                key.data = &key_cust_c_id;
                
                memset(&cust, 0, sizeof(struct customer));
                
                data.data = &cust;
                data.ulen = sizeof(struct customer);
                data.flags = DB_DBT_USERMEM;
                
                ret = dbp->get(dbp, NULL, &key, &data, 0);
                print_error(ret);
                
//              printf("c_id = %d, name = %s, address = %s, age = %d.\n",
//                              cust.c_id, cust.name, cust.address, cust.age);
        }
        time ( &tick2 );
        printf("Berkeley DB : 打开、关闭并操作数据库文件 %d 次, 时间为: %4ld s\n", num, tick2 -
tick1 );
        
        if(dbp != NULL)
                dbp->close(dbp, 0);
        
        return 0;
}
// 数据结构DBT在使用前,应首先初始化,否则编译可通过但运行时报参数错误
void init_dbt( DBT *key, DBT *data )
{
        memset(key, 0, sizeof(DBT));
        memset(data, 0, sizeof(DBT));
}
// DB的函数执行完成后,返回0代表成功,否则失败
void print_error(int r)
{
        if(r != 0)
                printf("ERROR: %s\n",db_strerror(r));
}

-- 
View this message in context: 
http://www.nabble.com/the-speed-of-embedded-database-engines%2C-sqlite3-vs-berkeley-db%2C-I%27m-confused-tp23209208p23209208.html
Sent from the SQLite mailing list archive at Nabble.com.

_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to