Linux——网络(5)

一、sqlite3性能测试

1. 程序效率测试

    时间相关接口:

    int gettimeofday(struct timeval*tv, struct timezone *tz);
    功能:得到从1970年1月1日0时0分0秒到现在的秒数
               精度到微妙
    参数:
               tv:获取到的秒数
     struct timeval {
               time_t      tv_sec;     /* seconds */             秒
        suseconds_t tv_usec;    /* microseconds */     微妙    1s=1000000us
                            };

               tz:关于时区
      struct timezone {
          int tz_minuteswest;     /* minutes west of Greenwich */  格林威治向西的分钟数
                   int tz_dsttime;     /* type of DST correction */         夏令时修正的类型
                                };
    返回值:
                成功:0
                失败:-1       

        可以利用该函数来计算一个程序的运行时间,只需在程序前后调用该函数,并且后来的函数时间减去开始的函数时间就可以。注意单位的转变。

    普通插入
    insert 19660 : time : 32s
    开启事务机制
    insert 19660 : time : 0.155288s
    关闭写同步
    //insert 19660 : time : 0.150166s
    执行准备
    insert 19660 : time : 0.026s

二、提高SQLite数据插入效率

    1. 开启事务机制

        所谓”事务“就是指一组SQL命令,这些命令要么一起执行,要么都不被执行。在SQLite中,每调用一次sqlite3_exec()函数,
        就会隐式地开启了一个事务,如果插入一条数据,就调用该函数一次,事务就会被反复地开启、关闭,会增大IO量。
        如果在插入数据前显式开启事务,插入后再一起提交,则会大大提高IO效率,进而加数据快插入速度。      
        eg:
            开启事务
            BEGIN;
            将事务的修改保存到数据库中
            COMMIT;
        sqlite3_exec(db,"begin;",NULL,NULL,NULL);  
        sqlite3_exec(db,"commit;",NULL,NULL,NULL);  

    2. 关闭写同步

        synchronous Pragma 获取或设置当前磁盘的同步模式,该模式控制积极的 SQLite 如何将数据写入物理存储。
        在SQLite中,数据库配置的参数都由编译指示(pragma)来实现的,而其中synchronous选项有三种可选状态,
        full、normal、off。
        full写入速度最慢,但保证数据是安全的,不受断电、系统崩溃等影响;
        而off可以加速数据库的一些操作,但如果系统崩溃或断电,则数据库可能会损毁。
        关闭写同步
        PRAGMA synchronous = OFF;

    3.执行准备(事先将SQL语句编译好,执行时提高速度)

        SQLite执行SQL语句的时候,有两种方式:
        一种是使用sqlite3_exec(),该函数直接调用包含SQL语句的字符串;
        另一种方法就是“执行准备”(类似于存储过程)操作,即先将SQL语句编译好,然后再一步一步(或一行一行)地执行。
        如果采用前者的话,就算开起了事务,SQLite仍然要对循环中每一句SQL语句进行“词法分析”和“语法分析”,
        这对于同时插入大量数据的操作来说,简直就是浪费时间
        
        1.sqlite3_prepare_v2() 创建sqlite3_stmt语句对象
        2.sqlite3_bind_*()         绑定参数值到sqlite3_stmt
        3.sqlite3_step()            运行sql语句,可以是一次,也可以是循环执行
        4.sqlite3_reset()           重置sqlite3_stmt对象
        5.sqlite3_finalize()        销毁sqlite3_stmt对象
        代替sqlite3_exec()函数
        
        int sqlite3_prepare_v2(
            sqlite3 *db,                    //数据库连接对象
            const char *zSql,           //要编译的 SQL 语句
            int nByte,                       //要编译的 SQL 语句的长度,如果是-1,则自动计算其长度
            sqlite3_stmt **ppStmt,  //编译后的 SQLite3 语句对象
            const char **pzTail        //未编译部分的指针
        );

        功能:

                该函数将 SQL 语句编译成 SQLite 虚拟机指令,并将编译后的 SQLite3 语句对象存储在                  ppStmt 指向的指针中,以备执行。
        如果 pzTail 不是 NULL,则该指针将指向 SQL 语句中未编译部分的起始位置。
        返回值:
                成功,则返回 SQLITE_OK。
                失败,则返回一个错误代码。

        int sqlite3_bind_text(
          sqlite3_stmt*,      // SQLite3 语句对象
          int,                       // 值占位符的索引,从 1 开始
          const char*,        // 文本值的指针
          int,                      // 文本值的长度,如果是-1,则自动计算其长度
          void(*)(void*)     // 当值变成不需要时要调用的析构函数
        );
        功能:将文本值绑定到 SQLite3 语句对象中的值占位符上。
        
        int sqlite3_step(sqlite3_stmt *pStmt);
        功能:重置sqlite3_stmt对象
        参数:
                   pStmt:prepare语句编译出的sql语句实例


        int sqlite3_finalize(sqlite3_stmt *pStmt) 
        功能:销毁sqlite3_stmt对象

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值