小测SQLite内存与非内存万条插入

小测SQLite内存与非内存万条插入,第1张

概述代码:   // 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" //////////////////////////////////////

代码:

// 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加不加事务,相差两个数量级

总结

以上是内存溢出为你收集整理的小测SQLite内存与非内存万条插入全部内容,希望文章能够帮你解决小测SQLite内存与非内存万条插入所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1178246.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存