通过简单地查询公司表(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语言的高效处理能力,将日志信息解析并存储到数据表中,便于进一步的数据分析和处理。 首先,我们需要了解Go语言...
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数据库...
IIII II II 第18页(共39页)第18页(共39页) 第18页(共39页) 第18页(共39页) 基于java的网上购票系统的设计与实现全文共39页,当前为第1页。基于java的网上购票系统的设计与实现全文共39页,当前为第1页。基于...
通过理解 MySQL 的通信协议以及如何在不同编程语言中调整客户端的行为,开发者能够充分利用这个新工具来提升应用的健壮性和性能。在未来,随着 tracing 和审计日志功能的加入,调试和维护这些分布式事务将变得更加...
mysql_query("set names 'gdk'"); //设定字符集 $sql = "select username from user where username = '$_POST[username]'"; //SQL语句 $result = mysql_query($sql); //执行SQL语句 $num = mysql_...
Zipkin 提供了多种客户端库,支持各种编程语言,如 Java、Python、Node.js、Go 等。在你的应用程序中集成 Zipkin 客户端,可以轻松地发送追踪数据到 Zipkin Server。通常,这涉及到添加依赖、初始化客户端以及在...
### Java中的图片上传并在JSP页面显示 #### 知识点概述 本篇文章将详细介绍如何在Java项目中实现图片的上传功能,并将其显示在JSP页面上。这涉及到多个技术点,包括使用`commons-fileupload`组件处理文件上传、...
这些语言在不同的应用场景中都有广泛的应用,如Go语言在服务器端编程中表现优秀,Scala则有望替代Java等。学习这些语言有助于开发者在多种技术栈中保持竞争力。 8. 持续学习的重要性: 《程序员修炼之道》一书中...
其他如Scala和Go是现代的、高性能的编程语言,用于构建高并发和分布式系统。 数据库技术对于存储和检索数据至关重要。SQL(Structured Query Language)是关系型数据库的标准语言,MySQL是广泛使用的开源数据库,...
3. **Query和Criteria API**:Hibernate提供了强大的查询机制,包括HQL(Hibernate Query Language),一种面向对象的查询语言,以及Criteria API,一种基于对象的查询构建器,让查询更加灵活和可读。 4. **第二级...
Go语言的Gorm是一个流行的ORM库,支持多种数据库。通过`db.Open()`创建连接,`db.Where().Find()`执行查询,返回结构体数组。 10. **C# Entity Framework** .NET的Entity Framework是一个ORM框架,简化了与SQL ...
等级考试 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 ...
计算机二级等级考试主要涵盖计算机基础知识、编程语言、数据库管理、操作系统等多个方面。以下是对部分试题的详细解析: 1. 数据类型“TRUE/FALSE”在计算机中通常表示逻辑型("是/否"类型),用于存储布尔值,即真...
16. **Go语言**:Go,也称为Golang,是一种静态类型的编译型语言,由Google设计,用于简化系统级编程和并行处理。 17. **技术面试(Technical Interviews)**:面试技巧和策略,如如何清晰地解释复杂的概念,如何...
- NoSQL 数据库往往牺牲了一部分事务一致性以换取更高的性能和扩展性。 - **C、** - 该选项缺失描述,但从上下文判断,这里应是指NoSQL数据库可能具有的特点,正确答案为**C**。 **6. 本门课程中的学问图谱案例...
与Java和Perl不同,你不必把头埋进100多页的文档中努力学习才可以写出一个象样的程序。只要了解一些基本的语法和语言特色,你就可以开始你的PHP编码之旅了。之后你在编码过程中如果遇到了什么麻烦,还可以再去翻阅...