sqlite3测试打开关闭数据库的耗时

#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <cassert>

#include "sqlite3/sqlite3.h"
#include "utility/common.h"

// 测试数据库的打开和关闭对数据库性能的影响。

// 测试方法:
// 场景(A): 执行1000条写数据,一次打开数据库,一次关闭数据库。
// 场景(B): 执行1000条写数据,每次写都进行打开和关闭数据库。


static const char* kDatabaseName = "test.db";
static const char* kTurnOffSynchronous = "PRAGMA synchronous = OFF;";
static const char* kInsertSql = "INSERT INTO OPEN_CLOSE_COST_TEST(NAME) VALUES('Zhe');";
static const int kDataCount = 1000;

static bool OpenDB(const char* path, sqlite3** db) {
  assert(db != NULL);

  int rc = sqlite3_open(path, db);
  if (rc != SQLITE_OK) {
    std::cout << "Failed to open " << kDatabaseName << std::endl;
    std::cout << "Error msg: " << sqlite3_errmsg(*db) << std::endl;
    return false;
  }

  return true;
}

static void PrepareTable() {
  sqlite3* db = NULL;

  if (!OpenDB(kDatabaseName, &db)) {
    return;
  }

  const char* kCreateTableSql = "CREATE TABLE IF NOT EXISTS OPEN_CLOSE_COST_TEST( \
                                 ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \
                                 NAME TEXT NOT NULL)"; 
  char* error_msg = NULL;

  int rc = sqlite3_exec(db, kCreateTableSql, NULL, NULL, &error_msg);
  if (rc != SQLITE_OK) {
    std::cout << "Failed to create table!" << std::endl;
    std::cout << "Error msg: " << error_msg << std::endl;
    sqlite3_free(error_msg);
  }

  sqlite3_close(db);
}

static void ClearTable() {
  sqlite3* db = NULL;
  if (!OpenDB(kDatabaseName, &db)) {
    return;
  }

  const char* kClearTableSql = "DELETE FROM OPEN_CLOSE_COST_TEST;";
  char* error_msg = NULL;

  int rc = sqlite3_exec(db, kClearTableSql, NULL, NULL, &error_msg);
  if (rc != SQLITE_OK) {
    std::cout << "Failed to clear table!" << std::endl;
    std::cout << "Error msg: " << error_msg << std::endl;
    sqlite3_free(error_msg);
  }

  sqlite3_close(db);
}

static void TestOnceOpenClose() {
  utility::Timer timer;
  timer.Start();

  sqlite3* db = NULL;
  sqlite3_open(kDatabaseName, &db);
  sqlite3_exec(db, kTurnOffSynchronous, NULL, NULL, NULL);

  for (int i = 0; i < kDataCount; ++i) {
    sqlite3_exec(db, kInsertSql, NULL, NULL, NULL);
  }

  sqlite3_close(db);

  std::cout << "1. 执行1000条写数据,一次打开数据库,一次关闭数据库: " << timer.GetSeconds() << std::endl;
}

static void TestMultiOpenClose() {
  utility::Timer timer;
  timer.Start();

  sqlite3* db = NULL;

  for (int i = 0; i < kDataCount; ++i) {
    sqlite3_open(kDatabaseName, &db);
    sqlite3_exec(db, kTurnOffSynchronous, NULL, NULL, NULL);

    sqlite3_exec(db, kInsertSql, NULL, NULL, NULL);
    
    sqlite3_close(db);
  }

  std::cout << "2. 执行1000条写数据,每次写都进行打开和关闭数据库: " << timer.GetSeconds() << std::endl;
}

int main() {
  PrepareTable();
  ClearTable();

  TestOnceOpenClose();
  TestMultiOpenClose();

  return 0;
}


结果





  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值