通过简单地查询公司表(comp)的100条数据来直观地比较语言的性能。
环境:笔记本64位win10, jdk 1.8, go?1.11, 本机10.1.15-MariaDB。
?
class="java" name="code">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"); } }
?
// 连续查询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))) }
?
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
?
首先令人吃惊的是Go查询仅用了3毫秒,而Java快的也用了18毫秒。
其次mysql 官方的jdbc driver 从5.1升级到8.0后性能反而下降一倍左右:从18毫秒慢到了38毫秒。
?
初步看来,Go除了代码简洁外,运行性能也是令人放心的。
?