C++: Sqlite3几种数据插入方式比较

本文通过C++示例代码展示了SQLite数据库在不同同步模式(FULL、NORMAL、OFF)下的性能差异,并比较了使用事务的方式在FULL模式下进行大量数据插入的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在sqlite3中,数据的更新模式默认为PRAGMA synchronous = FULL; 这个参数影响了更新数据的速度。

下面的测试代码表明,OFF状态比Full状态的更新速度快50倍左右

1. 示例代码

#include "sqlite3.h"
#include <stdio.h>
#include <time.h>
#include <string.h>

static char s_szDBFile[] = "d:\\test.db";

//耗时计算
class CElapseTime
{
public:
	CElapseTime(char *sPrompt)
	{
		memset(m_sPrompt, 0, sizeof(m_sPrompt));
		strcpy(m_sPrompt, sPrompt);
		m_Start = clock();
	}

	~CElapseTime()
	{
		printf("[%s]耗时: %f\n", m_sPrompt, (clock() - m_Start)*1.0f/CLK_TCK);
	}

private:
	char m_sPrompt[255];
	clock_t m_Start;
};

void TestInsert_SYN(int n, char *sSync, char *szSql)
{
	char sPrompt[255];
	sprintf(sPrompt, "%s 状态, %d条记录", sSync, n);
	CElapseTime aET(sPrompt);
	char *errMsg;
	sqlite3 *pDB;
	sqlite3_open(s_szDBFile, &pDB);
	sprintf(sPrompt,"PRAGMA synchronous = %s;", sSync);
	sqlite3_exec(pDB, sPrompt, 0,0,0);
	for(int i=0; i<n; i++)
	{
		sqlite3_exec(pDB, szSql, 0, 0, &errMsg);
	}
	sqlite3_close(pDB);
}

void TestInsert_Full_Trans(int n, char *szSql)
{
	char sPrompt[255];
	sprintf(sPrompt, "FULL状态事务版, %d条记录", n);
	CElapseTime aET(sPrompt);
	char *errMsg;
	sqlite3 *pDB;
	sqlite3_open(s_szDBFile, &pDB);
	sqlite3_exec(pDB, "Begin transaction; ", 0,0,0);
	for(int i=0; i<n; i++)
	{
		sqlite3_exec(pDB, szSql, 0, 0, &errMsg);
	}
	sqlite3_exec(pDB,"commit transaction;",0,0, &errMsg);
	sqlite3_close(pDB);
}

void CreateDB()
{
	sqlite3 *pDB;
	sqlite3_open(s_szDBFile, &pDB);
	sqlite3_exec(pDB, "Create Table tblTest(a Text, b Text)", 0, 0, NULL);
	sqlite3_close(pDB);
}

void main()
{
	int n = 5;
	char szInsertSQL[] = "Insert into tblTest(A,B) values(\"中华人民共和国中华人民共和国中华人民共和国\",\"中华人民共2和国中华人民共和国2中华人民共和国2\");";
	CreateDB();
	TestInsert_SYN(n, "FULL", szInsertSQL);
	TestInsert_SYN(n, "NORMAL", szInsertSQL);
	n *= 100;
	TestInsert_SYN(n, "OFF", szInsertSQL);
	TestInsert_Full_Trans(n, szInsertSQL);
	remove(s_szDBFile);
}

2. 测试结果

机器配置xp sp3, i7-2640M, 内存3.48GB

[FULL 状态, 5条记录]耗时: 0.359000
[NORMAL 状态, 5条记录]耗时: 0.297000
[OFF 状态, 500条记录]耗时: 0.797000
[FULL状态事务版, 500条记录]耗时: 0.250000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值