golang SQLite3性能测试

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))
时间: 2024-08-29 15:55:18

golang SQLite3性能测试的相关文章

golang 单元测试&amp;&amp;性能测试

一:单元测试 1.为什么要做单元测试和性能测试 减少bug 快速定位bug 减少调试时间 提高代码质量 2.golang的单元测试 单元测试代码的go文件必须以_test.go结尾 单元测试的函数名必须以Test开头,是可导出公开的函数 测试函数的签名必须接收一个指向testing.T类型的指针,并且不能返回任何值 3.golang单元测试组 有好几个不同的输入以及输出组成的一组单元测试 4.测试覆盖率 go test -cover 直接输出覆盖率 go test -run TestAll 指定

golang sqlite3 CRUD

pacakge mainimport ( "database/sql" "fmt" "log" _ "github.com/mattn/go-sqlite3" // sqlite3 dirver ) // People have database fields type People struct { id int name string age int } type appContext struct { db *sql.D

golang map性能测试

golang map是golang的方便操作的key-value package main import ( "fmt" "math/rand" "time" _"strconv" ) var x = make(map[int]int, 100000001) //var x = make(map[string]string, 100000001) func main() { ttime := time.Now().UnixNa

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

典型的两个现实案例: 我们先看两个用Go做消息推送的案例实际处理能力. 360消息推送的数据: 16台机器,标配:24个硬件线程,64GB内存 Linux Kernel 2.6.32 x86_64 单机80万并发连接,load 0.2~0.4,CPU 总使用率 7%~10%,内存占用20GB (res) 目前接入的产品约1280万在线用户 2分钟一次GC,停顿2秒 (1.0.3 的 GC 不给力,直接升级到 tip,再次吃螃蟹) 15亿个心跳包/天,占大多数. 京东云消息推送系统 (团队人数:4

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

最近学习Golang,总想体验下并发到底有多叼,必我大 python强势多少. 学习了官方教程的http 服务,用性能测试工具wrk测试了下,发现结果很令人惊讶- wrk可以参考我的博客,有基本用法说明:http://blog.yuanzhaoyi.cn/2018/01/12/test.html 测试命令:wrk -t10 -d1m -c200 http://127.0.0.1:8080 含义:10线程,并发200链接,持续1分钟 http服务均返回基本的: "Hello World"

Golang 单元测试与性能测试

Go 自带了测试框架和工具,在 testing 包中,以便完成单元测试(T 类型)和性能测试(B 类型).一般测试代码放在*_test.go 文件中,与被测代码放于同一个包中. 单元测试 测试函数名称格式是:Test[^a-z],即以 Test 开头,跟上非小写字母开头的字符串.每个测试函数都接受一个testing.T 类型参数,用于输出信息或中断测试. 测试方法有: Fail: 标记失败,但继续执行当前测试函数 FailNow: 失败,立即终止当前测试函数执行 Log: 输出错误信息 Erro

【GoLang】GoLang 单元测试、性能测试使用方法

单元测试代码: ackage test import ( // "fmt" "testing" ) func Test_FlowControl(t *testing.T) { var x int64 = 10 if x == 10 { // fmt.Println("x is 10") t.Log("x is 10") } else { // fmt.Println("x is not 10") t.Log

Sqlite3常用的插入方法及性能测试

此篇博文是我一开始写在我的csdn(http://blog.csdn.net/roy1261/article/details/51501240)上,以后会慢慢把博文迁移到博客园 最近做到的项目涉及一个大数据量缓存重传,其中要用到的sqlite技术,把自己的学习心得整理了一下. SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.同时能够跟很多程序语言相结合,比如 Tcl.C#.PHP.Java等,还有ODBC接口,同样比起Mysql.Postgre

golang 单协程和多协程的性能测试

测试数据:单协程操作1亿数据,以及多协程(10条协程)操作1亿数据(每条协程操作1kw数据) 废话少说,贴代码: 单协程测试运算: package main import ( "fmt" "time" ) func testNum(num int) { for i := 1; i <= 10000000; i++{ num = num + i num = num - i num = num * i num = num / i } } func main() {