优化

   Sqlite3和其他数据库一样,提供了事务的概念。对于一条sql语句的执行,我们几乎感觉不到花费的时间,或者可以忽略不计。但是如果同时插入1000条或者更多记录时,我们必须考虑执行的性能。下面是两个同时插入1000条记录的例子,前者是优化前的,后者是优化后的。它们的执行性能有明显的差别,前者执行时间:109.7810ms,后者执行时间仅为:0.1710ms。

优化前代码:

       #include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"

int main()
{
    double start,finish;
    sqlite3 *db;
    sqlite3_stmt* stmt;
    const char *zTail;
    char *zErrMsg=0;
    int r=sqlite3_open("test.db",&db);
    if(r){
      printf("error happened:%s\n",sqlite3_errmsg(db));
    }

    char* sql="create table [test]([id] INTEGER PRIMARY KEY,[s] TEXT COLLATE NOCASE)";

    start=(double)clock();

    r=sqlite3_exec(db,sql,NULL,0,&zErrMsg);
    if(r!=SQLITE_OK)
    {
      printf("error happend:%s\n",zErrMsg);
    }

    sqlite3_prepare(db,"insert into test(s) values(?);",-1,&stmt,&zTail);

    int i;
    for(i=0;i<1000;i++)
    {
        sqlite3_bind_int(stmt,1,i);
        r=sqlite3_step(stmt);
        sqlite3_reset(stmt);
    }
    sqlite3_finalize(stmt);

    finish=(double)clock();
    printf("%.4fms",(finish-start)/1000);
}

优化后代码:

#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"

int main()
{
    double start,finish;
    sqlite3 *db;
    sqlite3_stmt* stmt;
    const char *zTail;
    char *zErrMsg=0;
    int r=sqlite3_open("test.db",&db);
    if(r){
      printf("error happened:%s\n",sqlite3_errmsg(db));
    }

    char* sql="create table [test]([id] INTEGER PRIMARY KEY,[s] TEXT COLLATE NOCASE)";

    start=(double)clock();

    r=sqlite3_exec(db,sql,NULL,0,&zErrMsg);
    if(r!=SQLITE_OK)
    {
      printf("error happend:%s\n",zErrMsg);
    }

   /*此处为添加的优化代码*/

    r=sqlite3_exec(db,"BEGIN;",0,0,&zErrMsg);/*手动开始事务*/

    sqlite3_prepare(db,"insert into test(s) values(?);",-1,&stmt,&zTail);

    int i;
    for(i=0;i<1000;i++)
    {
        sqlite3_bind_int(stmt,1,i);
        r=sqlite3_step(stmt);
        sqlite3_reset(stmt);
    }
    sqlite3_finalize(stmt);

   /*添加的优化代码结束事务*/

    r=sqlite3_exec(db,"COMMIT;",0,0,&zErrMsg);/*结束事务,提交*/
    /*
    这样SQLite将把全部要执行的SQL语句先缓存在内存当中,然后等到COMMIT的时候一次性的写入数据    库,这样数据库文件只被打开关闭了一次,效率自然大大的提高。有一组数据对比:
    优化前后时间对比:
    前:109。7810ms
    后:0.1710ms
    可见时间相差之大
    */
    finish=(double)clock();
    printf("%.4fms",(finish-start)/1000);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值