代码:
// name: memory_sqlite.c date: 2009/08/10 by JIN RIZE
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/time.h>
#include "sqlite3.h"
////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 在这里不声明,main中callback不能编译通过。
int callback(void* data,int ncols,char** values,char** headers);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//time caculation
long timecacul () {
struct timeval tv;
struct timezone tz;
gettimeofday(&tv,&tz);
return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Main FUNC
int main(int argc,char **argv)
{
sqlite3 *db;
int rc;
char *sql;
char *zErr;
long starttime,endtime,resulttime;
int i=0;
int num=10000;
// create db
rc=sqlite3_open(":memory:",&db);
if (rc){
fprintf(stderr,"Can't create MMDB: %s/n",sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
//create table
sql = "create table user(uid int,name varchar(20))";
rc= sqlite3_exec(db,sql,NULL,&zErr);
if (rc!= sqlITE_OK) {
if ( zErr!=NULL) {
fprintf(stderr,"sql error: %s/n",zErr);
sqlite3_free(zErr);
}
}
//select after insert
//这里非要定义为const,则下五行中参数data前面加(char*),强制转换,否则就不能通过编译
const char* data="callback function called";
char *qy="insert into user values(%d,%Q);";
//计时开始
starttime=timecacul();
/////////加事务的插入操作
sqlite3_exec(db,"BEGIN TRANSACTION;",&zErr);
for (i; i<num; i++)
{
sql=sqlite3_mprintf(qy,i,"ceshi");
rc=sqlite3_exec(db,callback,(char*) data,&zErr);
sqlite3_free(sql);
}
sqlite3_exec(db,"COMMIT TRANSACTION;",NULL);
//计时结束
endtime=timecacul();
resulttime=endtime-starttime;
//输出耗时
/* sql="select * from user;";
rc=sqlite3_exec(db,&zErr);
*/
printf("加事务的插入耗时:%dms./n",resulttime);
//////////不加事务
//计时开始
starttime=timecacul();
//不加事务的插入操作,注意i置0
for (i=0; i<num; i++)
{
sql=sqlite3_mprintf(qy,&zErr);
sqlite3_free(sql);
}
//计时结束
endtime=timecacul();
resulttime=endtime-starttime;
//输出耗时
printf("不加事务的插入耗时:%dms./n",resulttime);
if(rc!=sqlITE_OK){
if(zErr !=NULL){
fprintf(stderr,zErr);
sqlite3_free(zErr);
}
}
sqlite3_close(db);
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////
int callback(void* data,char** headers)
{
int i;
fprintf(stderr,"%s:",(const char*) data);
for (i=0; i<ncols; i++) {
fprintf(stderr,"%s=%s.",headers[i],values[i]);
}
fprintf (stderr,"/n");
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
测试结果:
[db@localhost sqlite3]$ gcc mem_sq.c -o mem_sq -L/usr/local/lib/ -lsqlite3
[db@localhost sqlite3]$ ./mem_sq
加事务的插入耗时:133ms.
不加事务的插入耗时:146ms.
[db@localhost sqlite3]$ ./mem_sq
加事务的插入耗时:133ms.
不加事务的插入耗时:146ms.
[db@localhost sqlite3]$
小结: 做内存数据库加不加事务,没什么太大区别
不做内存数据库,将rc=sqlite3_open(":memory:",&db); 改成 rc=sqlite3_open("iltaek.db",&db);
测试结果:
[db@localhost sqlite3]$ gcc mem_sq.c -o mem_sq -L/usr/local/lib/ -lsqlite3
[db@localhost sqlite3]$ ./mem_sq
加事务的插入耗时:140ms.
不加事务的插入耗时:23899ms.
[db@localhost sqlite3]$ ./mem_sq
加事务的插入耗时:137ms.
不加事务的插入耗时:17174ms.
[db@localhost sqlite3]$ ./mem_sq
加事务的插入耗时:139ms.
不加事务的插入耗时:21210ms.
(生出了个307KB大小的iltaek.db 文件)
小结:不做MMDB加不加事务,相差两个数量级