SQLite是个小型的数据库,很简洁,即支持文件也支持内存,比较适合小型的独立项目,在没有网络的时候做一些复杂的关系数据存储和运算。

为了考察性能做10M(1000万)条记录的测试,测试机4CPU、8G内存,操作系统:Ubuntu 16

测试结果:

10M条写入时间:92秒

平均每条检索时间:0.0172毫秒

最大内存占用1.7G

使用的Driver

github.com/mattn/go-sqlite3

下面是测试的代码

//SQLite in memory,小心,不能只写:memory:,这样每一次连接都会申请内存
db, err := sql.Open("sqlite3", "file::memory:?mode=memory&cache=shared&loc=auto")
if err != nil {
fmt.Println("SQLite:", err)
}
defer db.Close()
fmt.Println("SQLite start")
//创建表//delete from BC;,SQLite字段类型比较少,bool型可以用INTEGER,字符串用TEXT
sqlStmt := `create table BC (b_code text not null primary key, c_code text not null, code_type INTEGER, is_new INTEGER);`
_, err = db.Exec(sqlStmt)
if err != nil {
fmt.Println("create table error->%q: %s\n", err, sqlStmt)
return
}
//创建索引,有索引和没索引性能差别巨大,根本就不是一个量级,有兴趣的可以去掉试试
_, err = db.Exec("CREATE INDEX inx_c_code ON BC(c_code);")
if err != nil {
fmt.Println("create index error->%q: %s\n", err, sqlStmt)
return
}
//写入10M条记录
start := time.Now().Unix()
tx, err := db.Begin()
if err != nil {
fmt.Println("%q", err)
}
stmt, err := tx.Prepare("insert into BC(b_code, c_code, code_type, is_new ) values(?,?,?,?)")
if err != nil {
fmt.Println("insert err %q", err)
}
defer stmt.Close()
var m int = 1000 * 1000
var total int = 10 * m
for i := 0; i < total; i++ {
_, err = stmt.Exec(fmt.Sprintf("B%024d", i), fmt.Sprintf("C%024d", i), 0, 1)
if err != nil {
fmt.Println("%q", err)
}
}
tx.Commit()
insertEnd := time.Now().Unix()
//随机检索10M次
var count int64 = 0 stmt, err = db.Prepare("select b_code, c_code, code_type, is_new from BC where c_code = ? ")
if err != nil {
fmt.Println("select err %q", err)
}
defer stmt.Close()
bc := new(BCCode)
for i := 0; i < total; i++ { err = stmt.QueryRow(fmt.Sprintf("C%024d", i)).Scan(&bc.B_Code, &bc.C_Code, &bc.CodeType, &bc.IsNew)
if err != nil {
fmt.Println("query err %q", err)
}
//屏幕输出会花掉好多时间啊,计算耗时的时候还是关掉比较好
//fmt.Println("BCode=", bc.B_Code, "\tCCode=", bc.C_Code, "\tCodeType=", bc.CodeType, "\tIsNew=", bc.IsNew)
count++
}
readEnd := time.Now().Unix()
fmt.Println("insert span=", (insertEnd - start),
"read span=", (readEnd - insertEnd),
"avg read=", float64(readEnd-insertEnd)*1000/float64(count))

golang SQLite3性能测试的更多相关文章

  1. Golang RPC 性能测试

    Golang RPC 性能测试 | KDF5000 http://kdf5000.com/2017/03/28/Golang-RPC-性能测试/

  2. 我的Vue之旅 07 Axios + Golang + Sqlite3 实现简单评论机制

    第三期 · 使用 Vue 3.1 + TailWind.CSS + Axios + Golang + Sqlite3 实现简单评论机制 效果图 CommentArea.vue 我们需要借助js的Dat ...

  3. golang 单元测试&&性能测试

    一:单元测试 1.为什么要做单元测试和性能测试 减少bug 快速定位bug 减少调试时间 提高代码质量 2.golang的单元测试 单元测试代码的go文件必须以_test.go结尾 单元测试的函数名必 ...

  4. golang sqlite3 CRUD

    package main import ( "database/sql" "fmt" "log" _ "github.com/ma ...

  5. Golang适合高并发场景的原因分析

    http://blog.csdn.NET/ghj1976/article/details/27996095 典型的两个现实案例: 我们先看两个用Go做消息推送的案例实际处理能力. 360消息推送的数据 ...

  6. Golang 语言的单元测试和性能测试(也叫 压力测试)

    Golang单元测试对文件名和方法名,参数都有很严格的要求. 例如: 1.文件名必须以xx_test.go命名 2.方法必须是Test[^a-z]开头(T必须大写),func TestXxx (t * ...

  7. golang bufio、ioutil读文件的速度比较(性能测试)和影响因素分析

    前言 golang读取文件的方式主要有4种: 使用File自带的Read方法 使用bufio库的Read方法 使用io/ioutil库的ReadAll() 使用io/ioutil库的ReadFile( ...

  8. golang 性能测试pprof

    golang 性能测试包是位于 net/http 包下的 pprof,其相关介绍可以参看具体的 官方文档 有关 golang 性能测试使用特别简单,在 main 包中的引包位置直接引入: import ...

  9. 基本http服务性能测试(Python vs Golang)

    最近学习Golang,总想体验下并发到底有多叼,必我大 python强势多少. 学习了官方教程的http 服务,用性能测试工具wrk测试了下,发现结果很令人惊讶- wrk可以参考我的博客,有基本用法说 ...

随机推荐

  1. 基于Java语言开发jt808、jt809技术文章精华索引

    很多技术开发人员喜欢追逐最新的技术,如Node.js, go等语言,这些语言只是解决了某一个方面,如只是擅长异步高并发等等,却在企业管理后台开发方面提供的支持非常不够,造成项目团队技术选项失败,开发后 ...

  2. linux学习笔记24---命令grep

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是global search regular expression(RE) and ...

  3. lua工具库penlight--06数据(一)

    这篇太长了,分了两部分.(这个是机器翻译之后我又校对了一下,以后的都这样,人工翻译太累了.) 读数据文件 首先考虑清楚,你的确需要一个自定义的文件读入器吗?如果是,你能确定有能力写好吗? 正确,稳健, ...

  4. zookeeper安装与集群搭建

    此处以centos系统下zookeeper安装为例,详细步骤可参考官网文档:zookeeper教程 一.单节点部署 1.下载zookeeper wget http://mirrors.hust.edu ...

  5. 大数据(9) - Flume的安装与使用

    Flume简介 --(实时抽取数据的工具) 1) Flume提供一个分布式的,可靠的,对大数据量的日志进行高效收集.聚集.移动的服务,Flume只能在Unix环境下运行. 2) Flume基于流式架构 ...

  6. phpcms利用广告位实现轮播图调用

    如果我们使用自带的广告轮播,那么就是失去原有的轮播样式,这里就教大家一种使用广告轮播,还能保留原有的轮播样式 1.需要找到广告位的模块位置 3 下载广告代码 https://files.cnblogs ...

  7. php linux 创建文件夹权限问题

    $path = "DataMsg/"; if(is_dir($path)==false){ @mkdir($path,0777); } windows 上创建没问题.但在linux ...

  8. EasyUI DataGrid 多级表头设置

    使用EasyUI做一个报表统计,需要合并表头为多级表头,核心代码如下: $('#dg').datagrid({ url:'datagrid_data.action', fit : true, fitC ...

  9. iOS项目开发实战——自己定义圆形进度提示控件

    iOS中默认的进度条是水平方向的进度条,这往往不能满足我们的需求. 可是我们能够自己定义类似的圆形的进度提示控件,主要使用iOS中的画图机制来实现. 这里我们要实现一个通过button点击然后圆形进度 ...

  10. 【R】自定义描述统计函数-从均值到峰度偏度

    data_show<-function(x) { n<-length(x) m<-mean(x) v<-var(x) s<-sd(x) me<-median(x) ...