`
pelli
  • 浏览: 6174 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java和Go性能的简单比较(mysql query)

阅读更多

通过简单地查询公司表(comp)的100条数据来直观地比较语言的性能。

环境:笔记本64位win10, jdk 1.8, go 1.11, 本机10.1.15-MariaDB。

 

1. java代码

package main;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 连续查询100条comp,测试时间:
 */
public class TestSqlStress {

    public static void main(String[] args) throws Exception {
        long start0 = System.currentTimeMillis();
        String url = "jdbc:mysql://127.0.0.1:3306/testdb?connectionCollation=utf8mb4_general_ci&serverTimezone=Asia/Shanghai&user=root&password=1";
        Connection cn = DriverManager.getConnection(url);

        long start = System.currentTimeMillis();

        String query = "SELECT id,sync_key,name,logo_url,capital,found_date,staff,tel,addr,intro,\n" +
                "            IFNULL(tag_codes,\"\") 'tag_codes', IFNULL(tag_names,\"\") 'tag_names',\n" +
                "            Unix_timestamp(create_time) 'create_time', is_disable, \n" +
                "            IFNULL(Unix_timestamp(disable_time),0) 'disable_time', IFNULL(disable_remark, \"\") 'disable_remark'\n" +
                "        FROM comp\n" +
                "        LIMIT 100";
        Statement stmt = cn.createStatement();
        ResultSet rs = stmt.executeQuery(query);

        long id;
        String sync_key, name, logo_url,capital,found_date,staff,tel,addr,intro;
        String tag_codes, tag_names;
        long create_time, is_disable, disable_time;
        String disable_remark;

        List arr = new ArrayList(200);
        while (rs.next()) {
            id = rs.getLong(1);
            sync_key = rs.getString(2);
            name = rs.getString(3);
            logo_url = rs.getString(4);
            capital = rs.getString(5);
            found_date = rs.getString(6);
            staff = rs.getString(7);
            tel = rs.getString(8);
            addr = rs.getString(9);
            intro = rs.getString(10);
            tag_codes = rs.getString(11);
            tag_names = rs.getString(12);
            create_time = rs.getLong(13);
            is_disable = rs.getLong(14);
            disable_time = rs.getLong(15);
            disable_remark = rs.getString(16);

            Map map = new HashMap();
            map.put("id", id);
            map.put("sync_key", sync_key);
            map.put("name", name);
            map.put("logo_url", logo_url);
            map.put("capital", capital);
            map.put("found_date", found_date);
            map.put("staff", staff);
            map.put("tel", tel);
            map.put("addr", addr);
            map.put("intro", intro);
            map.put("tag_codes", tag_codes);
            map.put("tag_names", tag_names);
            map.put("create_time", create_time);
            map.put("is_disable", is_disable);
            map.put("disable_time", disable_time);
            map.put("disable_remark", disable_remark);
            arr.add(map);
        }

        System.out.println("query took " + (System.currentTimeMillis() - start) + " ms");

        String str = arr.toString();
        System.out.println("str len=" + str.length());

        rs.close();
        stmt.close();
        cn.close();
        System.out.println("main took " + (System.currentTimeMillis() - start0) + " ms");
    }

}

 

2. Go代码

// 连续查询100条comp,测试时间
package main

import (
    "database/sql"
    "encoding/json"
    "fmt"
    "time"

    _ "github.com/ziutek/mymysql/godrv"
)

func main() {
    start0 := time.Now()
    defer func() {
        fmt.Println("main took", time.Since(start0).Nanoseconds() / 1000000, "ms")
    }()

    db, err := sql.Open("mymysql", "tcp:127.0.0.1:3306*testdb/root/1")
    if err != nil { panic(err) }
    defer db.Close()

    start := time.Now()

    query := `
        SELECT id,sync_key,name,logo_url,capital,found_date,staff,tel,addr,intro,
            IFNULL(tag_codes,"") 'tag_codes', IFNULL(tag_names,"") 'tag_names',
            Unix_timestamp(create_time) 'create_time', is_disable, 
            IFNULL(Unix_timestamp(disable_time),0) 'disable_time', IFNULL(disable_remark, "") 'disable_remark'
        FROM comp
        LIMIT 100
    `
    rows, err := db.Query(query)
    if err != nil { panic(err) }
    defer rows.Close()

    var id int64
    var sync_key, name, logo_url,capital,found_date,staff,tel,addr,intro string
    var tag_codes, tag_names string
    var create_time, is_disable, disable_time int64
    var disable_remark string

    arr := make([]map[string]interface{}, 0)
    for rows.Next() {
        err = rows.Scan(&id, &sync_key, &name, &logo_url, &capital, &found_date, &staff, &tel, &addr, &intro,
            &tag_codes, &tag_names, 
            &create_time, &is_disable, &disable_time,
            &disable_remark)
        if err != nil { panic(err) }

        ma := map[string]interface{} {
            "id": id,
            "sync_key": sync_key,
            "name": name,
            "logo_url": logo_url,
            "capital": capital,
            "found_date": found_date,
            "staff": staff,
            "tel": tel,
            "addr": addr,
            "intro": intro,
            "tag_codes": tag_codes,
            "tag_names": tag_names,
            "create_time": create_time,
            "is_disable": is_disable,
            "disable_time": disable_time,
            "disable_remark": disable_remark,
        }
        arr = append(arr, ma)
    }
    err = rows.Err()  // rows.Next 的错误
    if err != nil { panic(err) }

    fmt.Println("query took", time.Since(start).Nanoseconds() / 1000000, "ms")

    buf, err := json.Marshal(arr)
    if err != nil { panic("json marshal error: " + err.Error()) }
    fmt.Println("json len=", len(string(buf)))
}

 

3. 测试结果

sql_stress Go (ziutek/mymysql v1.5.4)

    query took 3 ms

    json len= 90520

    main took 6 ms

sql_stress Java

    -- mysql-connector-java-5.1.25

        query took 18 ms

        str len=50869

        main took 389 ms

    -- mysql-connector-java-8.0.15

        query took 38 ms

        str len=50869

        main took 473 ms

 

4. 结论分析

首先令人吃惊的是Go查询仅用了3毫秒,而Java快的也用了18毫秒。

其次mysql 官方的jdbc driver 从5.1升级到8.0后性能反而下降一倍左右:从18毫秒慢到了38毫秒。

 

初步看来,Go除了代码简洁外,运行性能也是令人放心的。

 

分享到:
评论

相关推荐

    go写的mysql的慢查询日志解析工具,输出到一个数据的表里边

    `go写的mysql的慢查询日志解析工具,输出到一个数据的表里边`这个项目显然旨在解决这个问题,利用Go语言的高效处理能力,将日志信息解析并存储到数据表中,便于进一步的数据分析和处理。 首先,我们需要了解Go语言...

    java学生宿舍管理系统源码-zcnote:笔记类,包括mysql,php,nginx,linux,go,python,算法等等

    java学生宿舍管理系统 源码 目录 c socket css golang base beego bolt confd etcd geecache gin gmq grpc influxdb nsq study supervisord java spring javascript linux mongodb mysql canal kindshard数据库...

    基于java的网上购票系统的设计与实现.docx

    IIII II II 第18页(共39页)第18页(共39页) 第18页(共39页) 第18页(共39页) 基于java的网上购票系统的设计与实现全文共39页,当前为第1页。基于java的网上购票系统的设计与实现全文共39页,当前为第1页。基于...

    dotnet core 也能协调分布式事务啦!.doc

    通过理解 MySQL 的通信协议以及如何在不同编程语言中调整客户端的行为,开发者能够充分利用这个新工具来提升应用的健壮性和性能。在未来,随着 tracing 和审计日志功能的加入,调试和维护这些分布式事务将变得更加...

    php 简单注册登录实现

    mysql_query("set names 'gdk'"); //设定字符集 $sql = "select username from user where username = '$_POST[username]'"; //SQL语句 $result = mysql_query($sql); //执行SQL语句 $num = mysql_...

    zipkin-server最新jar包

    Zipkin 提供了多种客户端库,支持各种编程语言,如 Java、Python、Node.js、Go 等。在你的应用程序中集成 Zipkin 客户端,可以轻松地发送追踪数据到 Zipkin Server。通常,这涉及到添加依赖、初始化客户端以及在...

    java中图片上传并在jsp页面显示.txt

    ### Java中的图片上传并在JSP页面显示 #### 知识点概述 本篇文章将详细介绍如何在Java项目中实现图片的上传功能,并将其显示在JSP页面上。这涉及到多个技术点,包括使用`commons-fileupload`组件处理文件上传、...

    阿里云大学编程语言学习内容集锦

    这些语言在不同的应用场景中都有广泛的应用,如Go语言在服务器端编程中表现优秀,Scala则有望替代Java等。学习这些语言有助于开发者在多种技术栈中保持竞争力。 8. 持续学习的重要性: 《程序员修炼之道》一书中...

    IT技术分类.pdf

    其他如Scala和Go是现代的、高性能的编程语言,用于构建高并发和分布式系统。 数据库技术对于存储和检索数据至关重要。SQL(Structured Query Language)是关系型数据库的标准语言,MySQL是广泛使用的开源数据库,...

    hibernate-3.2.1-all-bin.zip

    3. **Query和Criteria API**:Hibernate提供了强大的查询机制,包括HQL(Hibernate Query Language),一种面向对象的查询语言,以及Criteria API,一种基于对象的查询构建器,让查询更加灵活和可读。 4. **第二级...

    11种连接数据库的方法

    Go语言的Gorm是一个流行的ORM库,支持多种数据库。通过`db.Open()`创建连接,`db.Where().Find()`执行查询,返回结构体数组。 10. **C# Entity Framework** .NET的Entity Framework是一个ORM框架,简化了与SQL ...

    基于springboot+vue的计算机等级考试报名系统源码数据库论文.docx

    等级考试 had to go through offline processes, mainly through on-site registration or by phone. Although they could achieve their goals, these methods were time-consuming and laborious, and didn't ...

    2021-2022计算机二级等级考试试题及答案No.12572.docx

    计算机二级等级考试主要涵盖计算机基础知识、编程语言、数据库管理、操作系统等多个方面。以下是对部分试题的详细解析: 1. 数据类型“TRUE/FALSE”在计算机中通常表示逻辑型("是/否"类型),用于存储布尔值,即真...

    访谈:在我进行访谈时曾被问到的一些奇特的问题。 我有些人在面试时问

    16. **Go语言**:Go,也称为Golang,是一种静态类型的编译型语言,由Google设计,用于简化系统级编程和并行处理。 17. **技术面试(Technical Interviews)**:面试技巧和策略,如如何清晰地解释复杂的概念,如何...

    nosql分布式数据库期末考试题.docx

    - NoSQL 数据库往往牺牲了一部分事务一致性以换取更高的性能和扩展性。 - **C、** - 该选项缺失描述,但从上下文判断,这里应是指NoSQL数据库可能具有的特点,正确答案为**C**。 **6. 本门课程中的学问图谱案例...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    与Java和Perl不同,你不必把头埋进100多页的文档中努力学习才可以写出一个象样的程序。只要了解一些基本的语法和语言特色,你就可以开始你的PHP编码之旅了。之后你在编码过程中如果遇到了什么麻烦,还可以再去翻阅...

Global site tag (gtag.js) - Google Analytics